設置驗證點及驗證方式
(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會報錯。
