spring validation校验对象多个字段返回的消息内容顺序随机问题

问题描述:

model中的代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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;
}

定义的分组接口如下

1
2
3
4
5
6
7
8
public interface UserGroup {
interface ADD {
}

interface UPDATE {

}
}

在使用Spring@Validated注解对对象中的多个参数进行校验时,在MethodArgumentNotValidException异常拦截器处发现如果有多个条件不符和校验规则的参数,MethodArgumentNotValidException中的bindingResult.getAllErrors()异常消息集合中的数据是按照随机顺序返回的,按照正常逻辑来说,我们肯定是想要按顺序将第一个不符合规范字段错误信息返回给用户。

解决办法

经过一番搜索发现可以给类上每个验证的注解都指定不同的group,然后在创建一个interface接口添加@GroupSequence对加在字段上的那些接口进行汇总,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@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()

作者: 只是学习学习
邮箱: fengzxia1000@163.com
原文地址: https://fengzxia.gitee.io/posts/3aad92e6.html
版权声明: 商业转载请联系作者获得授权,非商业转载请注明出处。