关于SpringMVC之认识Validation(5)

Java代码 
@Target({ElementType.FIELD, ElementType.METHOD}) 
@Retention(RetentionPolicy.RUNTIME) 
@Constraint(validatedBy=MinValidator.class) 
public @interface Min { 
 
    int value() default 0; 
   
    String message(); 
   
    Class<?>[] groups() default {}; 
   
    Class<? extends Payload>[] payload() default {}; 

 

MinValidator校验器

Java代码 
public class MinValidator implements ConstraintValidator<Min, Integer> { 
 
    private int minValue; 
   
    public void initialize(Min min) { 
      // TODO Auto-generated method stub 
      //把Min限制类型的属性value赋值给当前ConstraintValidator的成员变量minValue 
      minValue = min.value(); 
    } 
 
    public boolean isValid(Integer value, ConstraintValidatorContext arg1) { 
      // TODO Auto-generated method stub 
      //在这里我们就可以通过当前ConstraintValidator的成员变量minValue访问到当前限制类型Min的value属性了 
      return value >= minValue; 
    } 
 

 

继续来说一下ConstraintValidator泛型的第二个类型,我们已经知道它的第二个类型是对应的isValid的方法的第一个参数,从我给的参数名称value来看也可以知道isValid方法的第一个参数正是对应的当前需要校验的数据的值,而它的类型也正是对应的我们需要校验的数据的数据类型。这两者的数据类型必须保持一致,否则Spring会提示找不到对应数据类型的ConstraintValidator。建立了自己的限制类型及其对应的ConstraintValidator后,其用法跟标准的JSR-303限制类型是一样的。以下就是使用了上述自己定义的JSR-303限制类型——Money限制和Min限制的一个实体类:

Java代码 
public class User { 
   
    private int age; 
   
    private Double salary; 
 
    @Min(value=8, message="年龄不能小于8岁") 
    public int getAge() { 
      return age; 
    } 
 
    public void setAge(int age) { 
      this.age = age; 
    } 
 
    @Money(message="标准的金额形式为xxx.xx") 
    public Double getSalary() { 
      return salary; 
    } 
 
    public void setSalary(Double salary) { 
      this.salary = salary; 
    } 
   

 

另外再讲一点Spring对自定义JSR-303限制类型支持的新特性,那就是Spring支持往ConstraintValidator里面注入bean对象。现在假设我们在MoneyValidator里面需要用到Spring ApplicationContext容器中的一个UserController bean对象,那么我们可以给ConstraintValidator定义一个UserController属性,并给定其set方法,在set方法上加注解@Resource或@Autowired通过set方式来注入当前的ApplicationContext中拥有的UserController bean对象。关于@Resource和@AutoWired的区别可以参考这篇博客。所以我们可以这样来定义我们的MoneyValidator:

Java代码 
 
public class MoneyValidator implements ConstraintValidator<Money, Double> { 
 
    private String moneyReg = "^\\d+(\\.\\d{1,2})?$";//表示金额的正则表达式 
    private Pattern moneyPattern = Pattern.compile(moneyReg); 
    private UserController controller; 
   
    public void initialize(Money money) { 
      // TODO Auto-generated method stub 
       
    } 
 
    public boolean isValid(Double value, ConstraintValidatorContext arg1) { 
      // TODO Auto-generated method stub 
      System.out.println("UserController: .............." + controller); 
      if (value == null) 
          returntrue; 
      return moneyPattern.matcher(value.toString()).matches(); 
    } 
 
    public UserController getController() { 
      return controller; 
    } 
 
    @Resource 
    public void setController(UserController controller) { 
      this.controller = controller; 
    } 
 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e30e1b0177f786093ad8d5c45da701c0.html