Hibernate Validator参数验证

之前使用自定义注解结合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("发生错误,请联系管理员或稍候再试");
    }
}

你可能感兴趣的:(J2EE开发)