校验初体验(Max)

JSR-303 Bean Validation

  1. Hibernate-Validator
  2. @Min @Max @Positive
  3. //自定义校验

image.png
在构造器上面打上@Validated注解之后,在参数之前加上

  1. @Max(value = 10,message = "自定义信息,不可以超过10")
  2. @Min // 用法同上
  3. @Range(min = 1 , max = 10 , message = "message内容")

可以做字符串长度的最大效验

这个是简单效验,我们如果对一个自己的DTO对象进行验证呢?

DTO对象的简单效验

image.png
在控制器中参数之前加入@Validated 就可以做到参数检查了

对象级联效验

image.png
在需要验证的字段上面加上验证注解
image.png
外层级联上面添加@Valid 就可以做到对象级联的简单效验了

Valid和Validated

他们都可以开启校验,Valid 其实是一种认证标准,validated是一种扩展
那什么时候用Valid的,什么时候用Validated呢?
就按照上面用!开启验证Validated,使用级联的时候用Valid

自定义校验注解

关于自定义注解,我们新建一个对应功能的效验注解,每一个效验注解是要追随一个类的
image.png

注解代码

  1. import javax.validation.Constraint;
  2. import javax.validation.Payload;
  3. import java.lang.annotation.*;
  4. @Documented //注解的注释加入到文档中
  5. @Retention(RetentionPolicy.RUNTIME) // 注解保留在运行的阶段
  6. @Target({ElementType.TYPE,ElementType.FIELD}) // 注解目标对象是对象和方法
  7. @Constraint(validatedBy = PasswordValidator.class)
  8. public @interface PasswordEqual {
  9. int min() default 6;
  10. int max() default 16;
  11. String message() default "passwords are not equal";
  12. Class<?>[] groups() default {}; // 规范代码,必须写
  13. Class<? extends Payload>[] payload() default {}; // 规范代码,必须写
  14. // 关联类
  15. }

其中,min,max,message方法是对应注解中的参数
注解中的变量类型都是基本变量类型,不要使用牛皮的类型,好吗,宝贝

对应类的代码

  1. package com.zking.zsjking.validators;
  2. import com.zking.zsjking.dto.PersonDTO;
  3. import javax.validation.ConstraintValidator;
  4. import javax.validation.ConstraintValidatorContext;
  5. // 第一个是注解的类型
  6. //第二个参数是自定义注解修饰的目标类型(你这个注解打到哪里,就写什么类型,打到类上面就是类的类型,打到字段上面就是对应字段的类型)
  7. public class PasswordValidator implements ConstraintValidator<PasswordEqual, PersonDTO> {
  8. private int min;
  9. private int max;
  10. @Override
  11. public void initialize(PasswordEqual constraintAnnotation) {
  12. //获取到校验注解的参数
  13. this.min = constraintAnnotation.max();
  14. this.max = constraintAnnotation.min();
  15. }
  16. @Override
  17. public boolean isValid(PersonDTO personDTO, ConstraintValidatorContext constraintValidatorContext) {
  18. // todo 具体的字段校验
  19. // ******************
  20. //获取类的成员变量
  21. String password1 = personDTO.getPassword1();
  22. String password2 = personDTO.getPassword2();
  23. return password1.equals(password2);
  24. }
  25. }
  • 对应注解类是需要完成ConstraintValidator接口,起码重写isValid方法,在isValid方法中返回验证的结果
  • initiallize 中的参数可以获取使用注解的信息
  • isValid可以获取使用上面类的参数

使用

  1. @PasswordEqual
  2. public class Person {
  3. private String password1;
  4. private String password2;
  5. }

根据上面的例子,就可以做到参数效验了