app开发者平台在数字化时代的重要性与发展趋势解析
703
2022-11-30
spring validation多层对象校验教程
目录spring validation多层对象校验1、第一层对象定义2、第二层对象3、Controller层校验使用validation校验对象多个字段返回的消息内容顺序随机问题问题描述解决办法
spring validation多层对象校验
1、第一层对象定义
import java.io.Serializable;
import javax.validation.Valid;
/**
* 请求参数
* @Title: ReqIn.java
* @Package com.spring.pro.model
* @Description:
* @author ybwei
* @date 2018年9月18日 下午1:43:26
* @version V1.0
*/
public class ReqIn
private static final long serialVersionUID = 25549320423002325L;
/**
* 请求头信息
*/
private String head;
/**
* 请求主体信息
*/
@Valid
private T data;
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
2、第二层对象
import java.io.Serializable;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @Title: User.java
* @Package com.spring.pro.model
* @Description:
* @author ybwei
* @date 2018年9月18日 下午1:46:15
* @version V1.0
*/
public class User implements Serializable{
private static final long serialVersionUID = 6747944028911495569L;
private String id;
@NotBlank
private String name;
@NotNull
private Integer age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
3、Controller层校验使用
import javax.validation.Valid;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
http://import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON;
import com.spring.pro.model.ReqIn;
import com.spring.pro.model.User;
/**
* @Title: UserController.java
* @Package com.spring.pro.controller
* @Description:
* @author ybwei
* @date 2018年9月18日 下午1:48:14
* @version V1.0
*/
@RestController
public class UserController {
private Logger logger=LoggerFactory.getLogger(getClass());
/**
* 校验
* @param reqIn
* @return
* @author ybwei
*/
@PostMapping("/valid")
public HttpStatus valid(@Valid @RequestBody ReqIn
logger.info("reqIn:{}",JSON.toJSONString(reqIn));
return HttpStatus.OK;
}
}
validation校验对象多个字段返回的消息内容顺序随机问题
问题描述
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()
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~