Spring方法级别的验证

时间:2024-10-05 11:04:32

设置验证点及验证方式
(1)Spring方法级别的验证有多种验证方式,比较常用的有
  @NotBlank:主要是对字符串的验证,不为null且去除空白符之后长度大于0
  @NotNull:主要是对对象的验证,不为null,此处特别注意,当对int等类型进行验证时,需要使用这种方式,但是要使用int的封装类型Integer
  @NotEmpty:主要是对集合类对象的验证,集合中元素的个数大于0
(2)Spring方法级别的验证可以验证的点示范用例如下(忽略import)
  

  @Validated
  public class Test() {
    @NotBlank(message = "用户名不能为空")
    private String usr;     private int age;     public void grow(
      @NotNull(message = "增长的年龄不能为空") Integer ageAdd) {
      age += ageAdd;
    }     public @NotNull Integer howOld() {
      return age;
    }
  }

  可以对属性、方法入参和返回值等进行验证。
开启验证处理
  当对验证点进行验证之后,为了得到验证的结果,需要开启对验证结果的处理。在Spring3.1之后,只需要引入一个Bean即可,MethodValidationPostProcessor。根据spring的依赖注入方
式,可以采用xml配置,java配置的方式在spring自动注入时将MethodValidationPostProcessor注入到spring容器中,例如如下的java配置(忽略import):
  

  @Configuration
  public class beanConfig() {     @Bean
    public MethodValidationPostProcessor getBean() {
      return new MethodValidationPostProcessor();
    }
  }

  关于MethodValidationPostProcessor类的描述可自行阅读源码,在阅读源码时,我们可以看到MethodValidationPostProcessor类实现了InitializingBean接口,实现了InitializingBean
的afterPropertiesSet()方法,这是spring用于初始化的一个方法,在initial-method方法之前调用,值得深入研究。
回到开启验证处理,不仅需要引入MethodvalidationPostProcessor这个类,还需要在适当的地方添加@Validated注解,告诉MethodValidationPostProcessor这个类,此处需要验证结果处理。

@RequestParam与验证注解
  在controller中可能会同时出现@RequestParam和验证的注解(@NotBlank、@NotNull等),如下例:
  

  @RequestMapping("/index")
  public String list(
    @RequestParam(required = false, defaultValue = "") @NotBlank(message = "用户名不能为空") String usr)
    /*
      code
    */
  }

  解析:(1)如果url请求中有传参数,只需要验证@NotBlank;
     (2)如果url请求中没有传参数,@RequestParam中只要有defaultValue,不管required是true还是false,参数的值都赋为defaultValue的值,再验证@NotBlank;
     例:@ReuqstParam(required=true, defaulfValue"10011") @NotBlank(message="用户名不能为空") String usr
       此时没有传参,usr为10011,虽然required值为true,但是不会报错。
     (3)如果@RequestParam中required属性为true,没有defaultValue且url请求中没有传参,那么会返回@RequestParam的错误信息,不会返回@NotBlank的错误信息。
     例:@RequestParam(required=true) @NotBlank(message = "用户名不能为空") String usr
       此时没有传参,只会返回没有参数的错误。
  注意:没有传参与没有参数值是有区别的,required限制的是url中有这个参数,参数的值是多少并不关心,如果没有值,会被赋值为null;@NotBlank限制的是参数的值不能为空(null或去除空白符长度为0)。没有传参,required=true时会报错,没有参数值,@NotBlank会报错。