zoukankan      html  css  js  c++  java
  • Spring方法级别的验证

    设置验证点及验证方式
    (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会报错。

  • 相关阅读:
    不务正业系列-浅谈《过气堡垒》,一个RTS玩家的视角
    [LeetCode] 54. Spiral Matrix
    [LeetCode] 40. Combination Sum II
    138. Copy List with Random Pointer
    310. Minimum Height Trees
    4. Median of Two Sorted Arrays
    153. Find Minimum in Rotated Sorted Array
    33. Search in Rotated Sorted Array
    35. Search Insert Position
    278. First Bad Version
  • 原文地址:https://www.cnblogs.com/songxh-scse/p/7146472.html
Copyright © 2011-2022 走看看