SpringBoot 校验真实业务场景,你有遇到过吗?

0 前言

  • 我在公司进行业务开发时,遇到这样一个问题,我需要对前端提交的表单数据进行校验,但是校验顺序是随机的,不满足业务要求。在这里使用修改密码这个功能进行举例:修改密码时,需要输入原密码、新密码、确认新密码,因此这 3 项都不能为空。但如果前端表单里,这 3 项都不填,那么后端使用 @Valid + @NotBlank 进行校验时,校验顺序是随机的。

  • 下面看我是如何控制校验顺序的吧

1 随机顺序演示

  • 接收前端表单数据对象:

/**
* 传参
* @Author Jasper
* @Time 2024/01/20
*/
@Data
public class Param {
/** 原密码 */
@NotBlank(message = "原密码不能为空")
@Length(min = 6, max = 18, message = "密码长度必为6~18位!")
private String oldPassword;

/** 新密码 */
@NotBlank(message = "新密码不能为空")
@Length(min = 6, max = 18, message = "密码长度必为6~18位!")
private String newPassword;

/** 确认新密码 */
@NotBlank(message = "确认新密码不能为空")
@Length(min = 6, max = 18, message = "密码长度必为6~18位!")
private String confirmNewPassword;
}


  • Controller 层代码:

/**
* 前端控制器
* @Author Jasper
* @Time 2024/01/20
*/
@PostMapping("/modifyPassword")
public R<String> modifyPassword(@RequestBody @Valid Param param){
return userService.modifyPassword(param);
}


  • 多次发送请求后,发现校验顺序是随机的,如下图所示:

SpringBoot 校验真实业务场景,你有遇到过吗?


2 如何控制校验顺序

  • 经过上述演示,确认校验顺序是随机的,因此对代码进行改造,需要使用到 @GroupSequence 注解

  • 定义一个接口,@GroupSequence 注解里定义校验顺序

import javax.validation.GroupSequence;

/**
* 定义校验顺序
* @Author Jasper
* @Time 2024/01/20
*/
@GroupSequence({ValidGroup.First.class, ValidGroup.Second.class, ValidGroup.Third.class})
public interface ValidGroup {

interface First{

}

interface Second{

}

interface Third{

}
}


  • 接收前端表单数据对象:设置 groups 属性,定义校验顺序

/**
* 传参
* @Author Jasper
* @Time 2024/01/20
*/
@Data
public class Param {
/** 原密码 */
@NotBlank(groups = {ValidGroup.First.class}, message = "原密码不能为空")
@Length(min = 6, max = 18, message = "密码长度必为6~18位!")
private String oldPassword;

/** 新密码 */
@NotBlank(groups = {ValidGroup.Second.class}, message = "新密码不能为空")
@Length(min = 6, max = 18, message = "密码长度必为6~18位!")
private String newPassword;

/** 确认新密码 */
@NotBlank(groups = {ValidGroup.Third.class}, message = "确认新密码不能为空")
@Length(min = 6, max = 18, message = "密码长度必为6~18位!")
private String confirmNewPassword;
}


  • Controller 层代码:

    • 注意这里不再使用 @Valid 注解,而是使用 @Validated 注解,并传入自定义接口的 class 类型对象(总校验分组对象)

/**
* 前端控制器
* @Author Jasper
* @Time 2024/01/20
*/
@PostMapping("/modifyPassword")
public R<String> modifyPassword(@RequestBody @Validated(ValidGroup.class) Param param){
return userService.modifyPassword(param);
}


  • 多次发送请求,发现校验顺序是由代码控制的了,如图所示:

    SpringBoot 校验真实业务场景,你有遇到过吗?


  • 这样就达到了控制校验顺序的目的了


  • 创作不易,感谢阅读,若遇到问题,可以关注此微信公众号留言反馈,希望能够帮助到您。


原文始发于微信公众号(EzCoding):SpringBoot 校验真实业务场景,你有遇到过吗?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/203657.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!