設置驗證點及驗證方式
(1)Spring方法級別的驗證有多種驗證方式,比較經常使用的有
@NotBlank:主要是對字符串的驗證,不爲null且去除空白符以後長度大於0
@NotNull:主要是對對象的驗證,不爲null,此處特別注意,當對int等類型進行驗證時,須要使用這種方式,可是要使用int的封裝類型Integer
@NotEmpty:主要是對集合類對象的驗證,集合中元素的個數大於0
(2)Spring方法級別的驗證能夠驗證的點示範用例以下(忽略import)
java
@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):
spring
@Configuration public class beanConfig() { @Bean public MethodValidationPostProcessor getBean() { return new MethodValidationPostProcessor(); } }
關於MethodValidationPostProcessor類的描述可自行閱讀源碼,在閱讀源碼時,咱們能夠看到MethodValidationPostProcessor類實現了InitializingBean接口,實現了InitializingBean
的afterPropertiesSet()方法,這是spring用於初始化的一個方法,在initial-method方法以前調用,值得深刻研究。
回到開啓驗證處理,不只須要引入MethodvalidationPostProcessor這個類,還須要在適當的地方添加@Validated註解,告訴MethodValidationPostProcessor這個類,此處須要驗證結果處理。app
@RequestParam與驗證註解
在controller中可能會同時出現@RequestParam和驗證的註解(@NotBlank、@NotNull等),以下例:
ui
@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會報錯。url