之前使用自定义注解结合Spring AOP实现了一个@NotNull注解,注解作用于Controller层的方法中,对传入参数进行拦截判断是否为空。在后续开发使用中发现仅仅对参数进行是否为空判断是远远不够的,还包含其他的验证:字符串长度、邮箱格式、手机号格式等等。由此找到Hibernate Validator提供的一些注解。
常用注解如下:
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围
@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(regex=,flag=) 被注释的元素必须符合指定的正则表达式
使用方法
注解作用于 IO 的字段属性上
/**
* 用户IO
*/
@Data
public class User {
@Length(min = 6, max = 16)
@NotBlank(message = "用户名不为空")
private String username;
@NotBlank(message = "密码不为空")
private String password;
@Min(18)
private Integer age;
}
在Controller层使用@Valid注解,@Valid用在参数上,表示对该参数进行校验。如果对参数校验发现有误,会将错误注入到BindingResult中。
@RestController
public class Controller {
@RequestMapping("testNotNull.do")
public User Test(@Valid User user, BindingResult result) {
for (ObjectError error : result.getAllErrors()) {
System.out.println(error.getDefaultMessage());
}
return user;
}
}
或者可以使用@ControllerAdvice来做全局异常判断
@RestControllerAdvice
public class ControllerAdviceConf {
@ExceptionHandler(value = Exception.class)
public ApiResult handleException(HttpServletRequest request, HttpServletResponse response, Exception exception) {
if (exception instanceof BindException) {
// Hibernate Validator 异常(入参校验异常)
List<ObjectError> objectErrorList = ((BindException) exception).getBindingResult().getAllErrors();
return ApiResult.fail(objectErrorList.get(0).getDefaultMessage());
}
exception.printStackTrace();
return ApiResult.fail("发生错误,请联系管理员或稍候再试");
}
}