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.验证

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

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

相关推荐
稀土熊猫君6 小时前
一个人能做出什么开源项目?
vue.js·后端·开源
lizhongxuan6 小时前
Agent Runtime 中的 Code-driven Assembly
后端
货拉拉技术7 小时前
资损下降 99.96% 的背后: AI 资损防控平台实战
后端
用户8358086187917 小时前
撮合引擎 OrderBook 的 100ns 之路:无锁 RingBuffer + 伪共享消除,Go 1.22 下单 op 11ns
后端
用户881863001367 小时前
用Node.js写一个简单的API请求日志中间件
后端
用户8358086187917 小时前
Go 高并发下的“内存刺客“:自研 Size-Class 无锁对象池,把 sync.Pool 的 P99 从 128μs 压到 41μs
后端
杉氧7 小时前
副作用 (Side Effects) 全攻略:如何像大师一样掌控 Composable 的生命周期?
android·架构·android jetpack
货拉拉技术7 小时前
资损下降 99.96% 的背后— AI 资损防控平台实战
后端
徐小夕8 小时前
jitword 协同文档3.2发布:打造浏览器中最强word编辑器
前端·架构·github
山水洛行9 小时前
AI Agent 智能体记忆:从检索到被治理的数据系统
后端