springboot框架项目实践应用七(validation分组、嵌套校验)

1.引言

上一篇文章,我们完成了spring validation的基础使用,已经能帮助我们处理大多数业务场景参数校验需求。

今天我们提出两类比较特殊的需求

  • 用户模块,增删改查用户信息,在增加与修改的时候,都需要使用UserQO接收参数。其中新增用户信息时,用户Id可为空,其它信息非空;修改用户信息时,用户Id不能为空,其它信息也不能为空。关注点:同一个UserQO,不同的校验需求,该如何实现?
  • 用户信息UserQO中,除了用户Id、用户名称、用户年龄基本类型属性外,还包含了用户地址信息Address,且地址信息需要校验。关注点:用户UserQO中,包含非基本类型Address,该如何实现Address的相关校验?

看了以上两类需求,我们稍微总结一下

  • 第一类是同一个bean对象中,不同的业务场景校验需求不一样,需要分组校验支持
  • 第二类是bean对象中,包含了其它的bean对象,需要嵌套校验支持

整好spring validation框架都分组校验、与嵌套校验,很好的帮助我们处理了以上业务场景。我们通过案例具体来看一看。

2.案例

2.1.分组校验

2.1.1.分组标识接口Save

java 复制代码
/**
 * 保存分组,标识接口
 *
 * @author ThinkPad
 * @version 1.0
 */
public interface Save {
}

2.1.2.分组标识接口Update

java 复制代码
/**
 * 更新分组,标识接口
 *
 * @author ThinkPad
 * @version 1.0
 */
public interface Update {
}

2.1.3.改造UserQO

在校验注解@NotNull、@NotBlank、@Length注解中,增加groups属性

java 复制代码
/**
 * 用户请求参数接收bean
 *
 * @author ThinkPad
 * @version 1.0
 */
@Data
public class UserQO {

    /**
     * 用户id
     */
    @NotNull(message = "用户Id不能为空!", groups = {Update.class})
    private Long userId;

    /**
     * 用户名称
     */
    @NotBlank(message = "用户名称不能为空!",groups = {Save.class,Update.class})
    @Length(min = 2,max = 10,message = "用户名称长度必须在2-10个字符",groups = {Save.class,Update.class})
    private String username;

    /**
     * 用户年龄
     */
    @NotNull(message = "年龄不能为空!",groups = {Save.class,Update.class})
    private Integer age;

}

2.1.4.改造controller

在@Validated注解中,指定分组

java 复制代码
/**
 * post请求,通过@RequestBody注解,结合bean对象接收参数
 *
 * @author ThinkPad
 * @version 1.0
 */
@RestController
@RequestMapping("/post/valid")
@Slf4j
public class PostValidController {

    /**
     * 新增保存用户,用户Id可为空
     * @param qo
     * @return
     */
    @RequestMapping("save")
    public String saveUser(@RequestBody @Validated(Save.class) UserQO qo){

        log.info("新增用户.接收到用户信息:{}",qo);

        return "ok";
    }

    /**
     * 更新保存用户,用户Id非空
     * @param qo
     * @return
     */
    @RequestMapping("update")
    public String updateUser(@RequestBody @Validated(Update.class) UserQO qo){

        log.info("更新用户.接收到用户信息:{}",qo);

        return "ok";
    }
}

2.1.5.验证

新增:不需要校验用户Id

更新:校验用户Id非空

2.2.嵌套校验

2.2.1.AddressQO

java 复制代码
/**
 * 地址请求参数接收bean
 *
 * @author ThinkPad
 * @version 1.0
 */
@Data
public class AddressQO {

    @NotNull(message = "地址Id不能为空!", groups = {Update.class})
    private Long addressId;

    @NotBlank(message = "地址名称不能为空!", groups = {Save.class,Update.class})
    private String addressName;

}

2.2.2.改造UserQO

增加地址bean属性,注意address属性上需要加@Valid注解,该注解validation-api规范提供的

java 复制代码
 /**
 * 用户地址
 */
@Valid
private AddressQO address;

2.2.3.验证

正常:请求中传递地址名称

异常:请求中不传递地址名称

相关推荐
paopaokaka_luck2 小时前
基于SpringBoot+Vue的电影售票系统(协同过滤算法)
vue.js·spring boot·后端
zkmall2 小时前
企业电商解决方案哪家好?ZKmall模块商城全渠道支持 + 定制化服务更省心
大数据·运维·重构·架构·开源
陌殇殇5 小时前
SpringBoot整合SpringCache缓存
spring boot·redis·缓存
美狐美颜sdk6 小时前
跨平台直播美颜SDK集成实录:Android/iOS如何适配贴纸功能
android·人工智能·ios·架构·音视频·美颜sdk·第三方美颜sdk
小林学习编程8 小时前
Springboot + vue + uni-app小程序web端全套家具商场
前端·vue.js·spring boot
ladymorgana8 小时前
【Spring boot】tomcat Jetty Undertow对比,以及应用场景
spring boot·tomcat·jetty
IT_10248 小时前
Spring Boot项目开发实战销售管理系统——系统设计!
大数据·spring boot·后端
小雷FansUnion9 小时前
深入理解MCP架构:智能服务编排、上下文管理与动态路由实战
人工智能·架构·大模型·mcp
DCTANT9 小时前
【原创】国产化适配-全量迁移MySQL数据到OpenGauss数据库
java·数据库·spring boot·mysql·opengauss
ai小鬼头9 小时前
AIStarter最新版怎么卸载AI项目?一键删除操作指南(附路径设置技巧)
前端·后端·github