问题描述:
model中的代码如下
public class User {
@NotNull(message = "id不能为空", groups = UserGroup.UPDATE.class)
protected Integer id;
/**
* 姓名
*/
@NotBlank(message = "请输入姓名", groups = UserGroup.ADD.class)
private String name;
/**
* 性别
*/
@NotBlank(message = "请输入性别", groups = UserGroup.ADD.class)
private String sex;
/**
* 手机号
*/
@NotBlank(message = "请输入手机号", groups = UserGroup.ADD.class)
private String phone;
/**
* 邮箱
*/
@NotBlank(message = "请输入邮箱", groups = UserGroup.ADD.class)
private String email;
/**
* 公司名
*/
@NotBlank(message = "请输入公司名", groups = UserGroup.ADD.class)
private String companyName;
/**
* 职务
*/
@NotBlank(message = "请输入职务", groups = UserGroup.ADD.class)
private String position;
}
定义的分组接口如下
public interface UserGroup {
interface ADD {
}
interface UPDATE {
}
}
在使用Spring
的@Validated
注解对对象
中的多个参数进行校验时,在MethodArgumentNotValidException
异常拦截器处发现如果有多个条件不符和校验规则的参数,MethodArgumentNotValidException
中的bindingResult.getAllErrors()
异常消息集合中的数据是按照随机顺序返回的,按照正常逻辑来说,我们肯定是想要按顺序将第一个不符合规范字段错误信息返回给用户。
解决办法
经过一番搜索发现可以给类上每个验证的注解都指定不同的group
,然后在创建一个interface
接口添加@GroupSequence
对加在字段上的那些接口进行汇总,如下:
public interface UserGroup {
@GroupSequence({ADD.NAME.class,
ADD.SEX.class,
ADD.PHONE.class,
ADD.EMAIL.class,
ADD.COMPANY_NAME.class,
ADD.POSITION.class})
interface ADD {
interface NAME {}
interface SEX {}
interface PHONE {}
interface EMAIL {}
interface COMPANY_NAME {}
interface POSITION {}
}
interface UPDATE {
}
}
Model
@NoArgsConstructor
public class User {
@NotNull(message = "id不能为空", groups = UserGroup.UPDATE.class)
protected Integer id;
/**
* 姓名
*/
@NotBlank(message = "请输入姓名", groups = UserGroup.ADD.NAME.class)
private String name;
/**
* 性别 1.男 2.女 3.未知
*/
@NotBlank(message = "请输入性别", groups = UserGroup.ADD.SEX.class)
private String sex;
/**
* 手机号
*/
@NotBlank(message = "请输入手机号", groups = UserGroup.ADD.PHONE.class)
private String phone;
/**
* 邮箱
*/
@NotBlank(message = "请输入邮箱", groups = UserGroup.ADD.EMAIL.class)
private String email;
/**
* 公司名
*/
@NotBlank(message = "请输入公司名", groups = UserGroup.ADD.COMPANY_NAME.class)
private String companyName;
/**
* 职务
*/
@NotBlank(message = "请输入职务", groups = UserGroup.ADD.POSITION.class)
private String position;
}
在@GroupSequence
注解中指定设置的接口数组顺序,然后在参数进行校验的时候直接在@Validated
注解中放入UserGroup.ADD.class
这个接口类即可public Result add(@Validated(UserGroup.ADD.class) @RequestBody User user)
,validation
就会按照顺序返回错误信息,在异常拦截器中直接这样取出第一个错误信息即可MethodArgumentNotValidException.getBindingResult().getAllErrors().get(0).getDefaultMessage()