1. 程式人生 > 其它 >SpringBoot專案中優雅處理引數校驗失敗資訊

SpringBoot專案中優雅處理引數校驗失敗資訊

技術標籤:SpringBootspring bootjava

在springboot專案中對前端請求的引數進行校驗常用的註解:
@NotBlank,@NotNull,@Valid
示例:

public class UserRequest {
    @NotNull(message = "id不能為空")
    private long id;
 
    @NotBlank(message = "名字不能為空")
    @Length(min = 1, max = 50, message = "名字名稱長度不能大於50")
    @Pattern
(regexp ="[0-9A-Z_\\-]+", message = "名字只能為數字和大寫字母組合") private String name; //省略get/set方法 }

要使引數校驗生效要注意其方法使用@Valid註解標註實體,如:

    @PostMapping("/update")
    public MyResponse updateRequest(@Valid @RequestBody UserRequest  request) {
	//業務邏輯xxx  
    return MyResponse.
ok(); }

當請求中name欄位為空,系統會返回系統定義預設的異常,並沒有返回註解上列印的提示資訊
在這裡插入圖片描述
那如果將註解上對應的提示資訊進行返回給前端呢?

**
 * 引數校驗 異常捕捉處理類
 */
@ControllerAdvice
public class WebExceptionHandler {
 
    /**
     * 請求引數格式錯誤 @RequestBody上valid失敗後丟擲的異常是MethodArgumentNotValidException異常;我們可以根據不同的異常類在系統中進行配置攔截處理
     */
    @ExceptionHandler(MethodArgumentNotValidException.
class) @ResponseBody public MyResponse MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) { String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining()); MyResponse re = new MyResponse(); re.setCode("500"); re.setMsg(message); return re; } }

在呼叫更新介面檢視返回結果:
在這裡插入圖片描述
可以發現介面確實把校驗為通過的請求返回了,但是如果這個引數多個校驗都沒有通過,介面會校驗提示的資訊都返回,那如何只要有校驗失敗了,就結束返回呢?

新增一個配置類

package com.test;
import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;

import javax.validation.*;

/**
 * 通過這個配置改成校驗引數時只要出現校驗失敗的情況,就立即丟擲對應的異常,結束校驗,不再進行後續的校驗
 */
@Configuration
public class WebConfig {

    @Bean
    public Validator validator() {
        ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                .configure()
                //failFast的意思只要出現校驗失敗的情況,就立即結束校驗,不再進行後續的校驗。
                .failFast(true)
                .buildValidatorFactory();
        return validatorFactory.getValidator();
    }

    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
        methodValidationPostProcessor.setValidator(validator());
        return methodValidationPostProcessor;
    }

}

在呼叫更新介面,介面返回如下:
在這裡插入圖片描述
這樣就可以返回一個具體校驗的引數給前端。