spring validation多层对象校验教程

作者:xixingzhe2 时间:2023-11-27 15:17:49 

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<T> implements Serializable{
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;
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<User> 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()

来源:https://blog.csdn.net/xixingzhe2/article/details/82757203

标签:spring,validation,多层对象,校验
0
投稿

猜你喜欢

  • java的Arrays工具类实战

    2023-08-21 15:46:36
  • java 分转元与元转分实现操作

    2023-05-13 16:47:22
  • Java异常的处理机制

    2023-12-03 15:33:19
  • Android之ArcSlidingHelper制作圆弧滑动效果

    2021-07-23 03:10:24
  • eclipse 联想功能设置技巧

    2023-03-18 04:11:39
  • Tomcat 实现WebSocket详细介绍

    2023-08-12 21:22:11
  • JavaWeb中导出excel文件的简单方法

    2023-11-13 02:41:43
  • C语言 MD5的源码实例详解

    2022-12-22 05:37:16
  • 使用Enumeration和Iterator遍历集合类详解

    2023-01-05 11:57:51
  • 简单实现C#异步操作

    2022-09-05 06:03:00
  • java操作mongodb示例分享

    2023-09-07 19:00:02
  • RxJava+Retrofit+Mvp实现购物车

    2022-03-22 16:24:48
  • python gstreamer实现视频快进/快退/循环播放功能

    2022-07-06 10:09:20
  • Spring自定义注解配置简单日志示例

    2023-01-25 09:31:08
  • Android 偷拍功能实现(手机关闭依然拍照)详解及实例代码

    2023-01-08 00:23:19
  • Java emoji持久化mysql过程详解

    2023-10-10 23:11:49
  • springcloud项目占用内存好几个G导致服务器崩溃的问题

    2023-03-30 09:54:25
  • Java 实战项目锤炼之医院门诊收费管理系统的实现流程

    2022-08-10 11:35:08
  • java 实现websocket的两种方式实例详解

    2023-01-22 04:41:32
  • C#实现抓取和分析网页类实例

    2023-09-21 04:27:32
  • asp之家 软件编程 m.aspxhome.com