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會報錯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM