1. 程式人生 > >bean validation 分組驗證及分組順序

bean validation 分組驗證及分組順序

分組驗證及分組順序

如果我們想在新增的情況驗證id和name,而修改的情況驗證name和password,怎麼辦? 那麼就需要分組了。

首先定義分組介面:

  1. publicinterface First {  
  2. }  
  3. publicinterface Second {  
  4. }  

分組介面就是兩個普通的介面,用於標識,類似於java.io.Serializable。

接著我們使用分組介面標識實體:

  1. publicclass User implements Serializable {  
  2.     @NotNull(message = "{user.id.null}", groups = {First.
    class})  
  3.     private Long id;  
  4.     @Length(min = 5, max = 20, message = "{user.name.length.illegal}", groups = {Second.class})  
  5.     @Pattern(regexp = "[a-zA-Z]{5,20}", message = "{user.name.illegal}", groups = {Second.class})  
  6.     private String name;  
  7.     @NotNull(message = "{user.password.null}"
    , groups = {First.class, Second.class})  
  8.     private String password;  
  9. }  

驗證時使用如:

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

即通過@Validate註解標識要驗證的分組;如果要驗證兩個的話,可以這樣@Validated({First.class, Second.class})。

接下來我們來看看通過分組來指定順序;還記得之前的錯誤訊息嗎? user.name會顯示兩個錯誤訊息,而且順序不確定;如果我們先驗證一個訊息;如果不通過再驗證另一個怎麼辦?可以通過@GroupSequence指定分組驗證順序:

  1. @GroupSequence({First.class, Second.class, User.class})  
  2. publicclass User implements Serializable {  
  3.     private Long id;  
  4.     @Length(min = 5, max = 20, message = "{user.name.length.illegal}", groups = {First.class})  
  5.     @Pattern(regexp = "[a-zA-Z]{5,20}", message = "{user.name.illegal}", groups = {Second.class})  
  6.     private String name;  
  7.     private String password;  
  8. }  

通過@GroupSequence指定驗證順序:先驗證First分組,如果有錯誤立即返回而不會驗證Second分組,接著如果First分組驗證通過了,那麼才去驗證Second分組,最後指定User.class表示那些沒有分組的在最後。這樣我們就可以實現按順序驗證分組了。

       @GroupSequence只能運用在Type(也就是類)下。其中,Default.class不能出現在GroupSequence列表中,且對應類的Object.class是GroupSequence列表中的一部分,一般放在最後。

       Restful風格介面能夠返回JSON型別的資料形式:

{

    "code": "400",

    "data": null,

    "messages": [

        {

            "invalidValue": "Name : Donald, Street: Stree no 27, Phone : (123) 123-1234, city: Sydney",

            "message": "Invalid address: Check your phone number or zip code"

        }

    ]

}