分组验证及分组顺序
如果我们想在新增的情况验证id和name,而修改的情况验证name和password,怎么办? 那么就需要分组了。
首先定义分组接口:
- public interface First {
- }
- public interface Second {
- }
分组接口就是两个普通的接口,用于标识,类似于java.io.Serializable。
接着我们使用分组接口标识实体:
- public class User implements Serializable {
- @NotNull(message = "{user.id.null}", groups = {First.class})
- 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}", groups = {First.class, Second.class})
- 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})
- public class 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"
}
]
}