SpringMvc 请求参数验证(三)

doublespring注解

@Constraint注解是一个自定义校验规则的注解

涉及注解

  • @Documented: 可以让注解里面的注释,加入到文档里面
  • @Retention(RetentionPolicy.RUNTIME): 表示这个注解要保留在什么阶段,可以有其他值
  • @Target({ElementType.TYPE, …}): 指定当前注解使用在哪些目标上面
  • @Constraint(validatedBy = PasswordValidator.class): 哪个关联类进行验证的
  • @Validated:开启校验

代码实现

  1. 自定义注解
@Documented @Target({ElementType.FIELD, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = MyConstraintValidators.class ) public @interface MyConstraint { String message() default "参数校验不通过,请重新输入"; // 初始化值 long min() default 2; long max() default 10; // 默认格式 Class<?>[] groups() default {}; Class<? extends Payload[]>[] payload() default {}; }
  1. 通过 ConstraintValidator 接口实现处理类,spring 会把 ConstraintValidator 接口实现类自动注入到容器中。
/** * ConstraintValidator 接口, 如果是类注解需要指定的类, 字段注解则使用 Object 即可 */ public class MyConstraintValidators implements ConstraintValidator<MyConstraint, Object> { private long max; private long min; @Override public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) { return o >= min && <= max ; } @Override public void initialize(MyConstraint constraintAnnotation) { this.max = constraintAnnotation.max(); this.min = constraintAnnotation.min(); } }
  1. 进行校验
    自定义一个实体类 User
@Getter @Setter public class User { @MyConstraint(max = 20, min = 1, message = "异常") private long age; }

测试,在 Controller 中需要添加上 @Validated 注解,才会启动校验

public class My { @PostMapping("/api/test") public String test(@RequestBody @Validated User user) { System.out.println(user.getAge()); return "233"; } }