Bean注解@Validated的使用


 

1、SpringMVC驗證@Validated的使用

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

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

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

可以將edit.username.null與edit.password.size看為參數,在message中傳遞,具體請看第二步。

第二步: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,@NotBla只應用於字符串且在比較時會去除字符串的空格

@Email

驗證注解的元素值是Email,

也可以通過正則表達式和flag指定自定義的email格式

使用 這些注解很簡單,只需要在實體類中的變量屬性前面加上該注解即可。

  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參數傳圖,同時也將消息文件中定制的錯誤信息傳入,當然也可以直接不使用國際化文件,但是推薦使用,方便統一與修改。

  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參數即可,具體請看代碼示例:

  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"; 

11.}

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


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

2、@Validated的分組特性


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

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

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

這時候就用到groups分組分情況對Bean屬性變量進行驗證,也可以滿足多驗證。具體的需要一下兩個步驟

第一步:創建分組接口類


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

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

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


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

  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進行驗證。

  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分組可以對同一個變量進行多個驗證,如下代碼

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


第三是:默認的情況下,不同的分組約束驗證是無序的,但是在有些情況下驗證的相互約束很重要(比如前一個組驗證失敗,后面的將不再驗證等情況),所以groups分組的驗證也有前后驗證順序。使用@GroupSequence注解進行排序。

  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 { 

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

 

 


免責聲明!

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



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