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設置爲空:
返回結果:
這裏返回的信息雖然很詳細,但不是我們統一的規範,我們可以使用全局異常處理來返回我們想要的格式:
定義返回信息類:
@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如何優雅的校驗參數