bean validation 分組驗證及分組順序
分組驗證及分組順序
如果我們想在新增的情況驗證id和name,而修改的情況驗證name和password,怎麼辦? 那麼就需要分組了。
首先定義分組介面:
- publicinterface First {
- }
- publicinterface Second {
- }
分組介面就是兩個普通的介面,用於標識,類似於java.io.Serializable。
接著我們使用分組介面標識實體:
- publicclass User implements Serializable {
-
@NotNull(message = "{user.id.null}", groups = {First.
- private Long id;
- @Length(min = 5, max = 20, message = "{user.name.length.illegal}", groups = {Second.class})
- @Pattern(regexp = "[a-zA-Z]{5,20}", message = "{user.name.illegal}", groups = {Second.class})
- private String name;
-
@NotNull(message = "{user.password.null}"
- private String password;
- }
驗證時使用如:
- @RequestMapping("/save")
- public String save(@Validated({Second.class}) User user, BindingResult result) {
- if(result.hasErrors()) {
- return"error";
- }
- return"success";
- }
即通過@Validate註解標識要驗證的分組;如果要驗證兩個的話,可以這樣@Validated({First.class, Second.class})。
接下來我們來看看通過分組來指定順序;還記得之前的錯誤訊息嗎? user.name會顯示兩個錯誤訊息,而且順序不確定;如果我們先驗證一個訊息;如果不通過再驗證另一個怎麼辦?可以通過@GroupSequence指定分組驗證順序:
- @GroupSequence({First.class, Second.class, User.class})
- publicclass User implements Serializable {
- private Long id;
- @Length(min = 5, max = 20, message = "{user.name.length.illegal}", groups = {First.class})
- @Pattern(regexp = "[a-zA-Z]{5,20}", message = "{user.name.illegal}", groups = {Second.class})
- private String name;
- private String password;
- }
通過@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"
}
]
}