使用SpringMVC的@Validated註解驗證

一、SpringMVC驗證@Validated的使用

第一步:編寫國際化消息資源文件

編寫國際化消息資源ValidatedMessage.properties文件主要是用來顯示錯誤的消息定製html

 

[java] view plain copyjava

  1. edit.username.null=用戶名不能爲空  
  2. edit.password.size=密碼最少{min}位,最長{max}位  
  3. ......  

能夠將edit.username.null與edit.password.size看爲參數,在message中傳遞,具體請看第二步。git

 

第二步:Bean實體類中加註解

首先介紹關於驗證註解的類型種類正則表達式

 

@Null 限制只能爲null
@NotNull 限制必須不爲null
@AssertFalse 限制必須爲false
@AssertTrue 限制必須爲true
@DecimalMax(value) 限制必須爲一個不大於指定值的數字
@DecimalMin(value) 限制必須爲一個不小於指定值的數字
@Digits(integer,fraction) 限制必須爲一個小數,且整數部分的位數不能超過integer,小數部分的位數不能超過fraction
@Future 限制必須是一個未來的日期
@Max(value) 限制必須爲一個不大於指定值的數字
@Min(value) 限制必須爲一個不小於指定值的數字
@Past 驗證註解的元素值(日期類型)比當前時間早
@Pattern(value) 限制必須符合指定的正則表達式
@Size(max,min) 限制字符長度必須在min到max之間
@NotEmpty 驗證註解的元素值不爲null且不爲空(字符串長度不爲0、集合大小不爲0)
@NotBlank 驗證註解的元素值不爲空(不爲null、去除首位空格後長度爲0),不一樣於@NotEmpty,@NotBlank只應用於字符串且在比較時會去除字符串的空格
@Email 驗證註解的元素值是Email,也能夠經過正則表達式和flag指定自定義的email格式

使用 這些註解很簡單,只須要在實體類中的變量屬性前面加上該註解便可。數據庫

[html] view plain copyapp

  1. public class User {    
  2.     private String id;   
  3.     @NotEmpty(message = "{edit.username.null}")  
  4.     private String username;  
  5.     @Size(min=6 ,max= 20 ,message = "{edit.password.size}")  
  6.     private String password;  
  7.    ......  
  8. }  

其中{}至關於佔位符,將min、max參數傳圖,同時也將消息文件中定製的錯誤信息傳入,固然也能夠直接不使用國際化文件,可是推薦使用,方便統一與修改。spa

 

[html] view plain copy.net

  1. public class User {    
  2.     private String id;   
  3.     @NotEmpty(message = "用戶名不能爲空")  
  4.     private String username;  
  5.     @Size(min=6 ,max= 20 ,message = "密碼最少6位,最高20位")  
  6.     private String password;  
  7.    ......  
  8. }  

 

 

第三步:Controller層的編寫


Controller層的使用,很簡單。須要在相應的方法傳入的Bean參數前面增長註解@Validated,還有增長BindingResult參數便可,具體請看代碼示例:htm

[html] view plain copyblog

  1. @Controller    
  2. public class UserController {    
  3.     
  4.     @RequestMapping("/save")    
  5.     public String save(@Validated User user, BindingResult result) {    
  6.         if(result.hasErrors()) {    
  7.             return "error";    
  8.         }    
  9.         return "success";    
  10.     }    
  11. }  

 

第四步:在View層顯示錯誤信息


這裏就不作介紹了,實際項目中會封裝好相應的javcscript等方法,只須要調用就能夠返回頁面提示給用戶錯誤信息。
 

二、@Validated的分組特性


先在記錄以前,介紹一下這樣的場景:在對用戶的賬號密碼進行編輯保存以及新增是兩種不同的狀況。

編輯修改->保存:只須要驗證username與password是否符合條件便可,不須要驗證id(由於在數據庫中id已經存在)。

新增->保存:新增須要驗證username與password是否符合條件,還要驗證id。

這時候就用到groups分組分狀況對Bean屬性變量進行驗證,也能夠知足多驗證。具體的須要一下兩個步驟

第一步:建立分組接口類


分組接口類只是普通的接口類並無多大意義,只是用來標識這個屬性哪一種狀況下被驗證,這相似於java.io.Serializable  
 

[html] view plain copy

  1. public interface addUser{   
  2. }   
  3. public interface editUser{  
  4. }  

 

第二步:Controller方法參數中增長xxx.class接口


在對新增的用戶進行ID驗證,增長@Validated({addUser.class})接口類用來表示新增的User.getId()須要驗證。

[html] view plain copy

  1. @Controller    
  2. public class UserController {    
  3.     
  4.     @RequestMapping("/saveAdd")    
  5.     public String saveAddUser(@Validated({addUser.class}) User user, BindingResult result) {    
  6.         if(result.hasErrors()) {    
  7.             return "error";    
  8.         }    
  9.         return "success";    
  10.     }  

 

第三步:Bean中添加groups分組


在User實體類中添加groups分組@NotEmpty(groups={addUser.class})與UserController中@Validated({addUser.class})對應,說明在執行saveAddUser新增用戶的狀況下,纔對新增的用戶id進行驗證。
 

 

[html] view plain copy

  1. public class User {     
  2.     //在分組addUser時,驗證id不能爲空,其餘狀況下不作驗證  
  3.     @NotEmpty(groups={addUser.class})  
  4.     private String id;  
  5.     @NotEmpty(message = "用戶名不能爲空")  
  6.     private String username;  
  7.     @Size(min=6 ,max= 20 ,message = "密碼最少6位,最高20位")  
  8.     private String password;  
  9.    ......  
  10. }  

以上三步就能夠簡單地完成分組驗證,可是對分組驗證補充一下三點:

第一是:不分配groups分組時,默認每次都須要驗證。

第二是:經過groups分組能夠對同一個變量進行多個驗證,以下代碼

[html] view plain copy

  1. //對用戶名進行兩次不一樣狀況的驗證。  
  2. @NotEmpty(groups={First.class})  
  3. @Size(min=1,max=10,groups={Second.class})  
  4. public String username;   


第三是:默認的狀況下,不一樣的分組約束驗證是無序的,可是在有些狀況下驗證的相互約束很重要(好比前一個組驗證失敗,後面的將再也不驗證等狀況),因此groups分組的驗證也有先後驗證順序。使用@GroupSequence註解進行排序。

[html] view plain copy

  1. /*  
  2.  * 分組順序接口類  
  3.  */  
  4. import javax.validation.GroupSequence;  
  5. //分組序列先Frist再Second  
  6. @GroupSequence({First.class,Second.class})  
  7. public interface Group{  
  8. }  
  9.   
  10. @Controller    
  11. public class UserController {    
  12.     
  13.     @RequestMapping("/saveAdd")    
  14.     public String saveAddUser(@Validated({Group.class}) User user, BindingResult result) {    
  15.         if(result.hasErrors()) {    
  16.             return "error";    
  17.         }    
  18.         return "success";    
  19.     }  
相關文章
相關標籤/搜索