在SpringBoot使用BeanValidation校驗參數

Bean Validation

Bean Validation是Java定義的一套基於註解的數據校驗規範。Hibernate Validation是Bean Validation的一個實現。
Bean Validation官網:https://beanvalidation.org/
Hibernate Validation官網:http://hibernate.org/validator/

註解介紹

validator內置註解:
@Null 被註釋的元素必須爲 null
@NotNull 被註釋的元素必須不爲 null
@AssertTrue 被註釋的元素必須爲 true
@AssertFalse 被註釋的元素必須爲 false
@Min(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值
@Max(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值
@DecimalMin(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值
@DecimalMax(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值
@Size(max, min) 被註釋的元素的大小必須在指定的範圍內
@Digits (integer, fraction) 被註釋的元素必須是一個數字,其值必須在可接受的範圍內
@Past 被註釋的元素必須是一個過去的日期
@Future 被註釋的元素必須是一個將來的日期
@Pattern(value)被註釋的元素必須符合指定的正則表達式
Hibernate Validator 附加的註解:
@Email 被註釋的元素必須是電子郵箱地址
@Length 被註釋的字符串的大小必須在指定的範圍內
@NotEmpty 被註釋的字符串的必須非空
@Range 被註釋的元素必須在合適的範圍內
@NotBlank 驗證字符串非null,且長度必須大於0

簡單示例

使用idea新建SpringBoot項目,添加依賴:

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.1.Final</version>
</dependency>

創建傳輸對象:

@Data
public class StudentDTO {
    @NotNull(message = "id不能爲空!")
    private Integer id;
    @NotNull(message = "姓名不能爲空!")
    private String name;
    @NotNull(message = "年齡不能爲空!")
    private Integer age;
    @NotNull(message = "性別不能爲空!")
    private String sex;
}

創建controller,只需在參數前面加上@Validated註解就可以完成校驗:

@RestController
public class DemoController {
    @PostMapping("/test")
    public RespVO test(@RequestBody @Validated StudentDTO studentDTO){
        return RespVO.ok("success");
    }
}

使用postman進行測試,這裏將age設置爲空:
使用postman測試
返回結果:
返回結果
這裏返回的信息雖然很詳細,但不是我們統一的規範,我們可以使用全局異常處理來返回我們想要的格式:
定義返回信息類:

@Data
public class RespVO {
    public static RespVO ok(String msg){
        RespVO respVO = new RespVO();
        respVO.code = "200";
        respVO.setMsg(msg);
        respVO.timestamp = System.currentTimeMillis();
        return respVO;
    }
    public static RespVO error(String msg){
        RespVO respVO = new RespVO();
        respVO.code = "500";
        respVO.setMsg(msg);
        respVO.timestamp = System.currentTimeMillis();
        return respVO;
    }
    private String code;
    private String msg;
    private Long timestamp;
}

處理全局異常:

@ControllerAdvice
public class ExceptionHandler {
    @ResponseBody
    @org.springframework.web.bind.annotation.ExceptionHandler(MethodArgumentNotValidException.class)
    public RespVO HandleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        return RespVO.error(e.getBindingResult().getFieldError().getDefaultMessage());
    }
}

再次測試,得到我們想要的返回格式:
規範格式
也可以封裝函數,格式化錯誤信息:

/**
 * 結合BeanValid,格式化異常信息
 *
 * @param ex
 * @return
 */
private String getMessage(MethodArgumentNotValidException ex) {
    BindingResult bindingResult = ex.getBindingResult();
    StringBuilder sb = new StringBuilder();
    for (FieldError error : bindingResult.getFieldErrors()) {
        String field = error.getField();
        Object value = error.getRejectedValue();
        String msg = error.getDefaultMessage();
        String message = String.format("錯誤字段:%s,錯誤值:%s,原因:%s;", field, value, msg);
        sb.append(message);
    }
    return sb.toString();
}

參考文章:SpringBoot如何優雅的校驗參數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章