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如何优雅的校验参数