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

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

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

相关推荐
hstar952724 分钟前
三十三、面向对象底层逻辑-SpringMVC九大组件之HandlerExceptionResolver接口设计
java·spring·设计模式·架构
面朝大海,春不暖,花不开27 分钟前
Spring Security默认配置覆盖指南
java·后端·spring
互联网搬砖老肖34 分钟前
Web 架构之 CDN 加速原理与落地实践
前端·架构
Java技术小馆1 小时前
打印高质量日志的10条军规
java·后端·面试
白熊1882 小时前
【推荐算法】DeepFM:特征交叉建模的革命性架构
算法·架构·推荐算法
陈随易3 小时前
Element Plus 2.10.0 重磅发布!新增Splitter组件
前端·后端·程序员
陈随易3 小时前
2025年100个产品计划之第11个(哆啦工具箱) - 像哆啦A梦口袋一样丰富的工具箱
前端·后端·程序员
PetterHillWater3 小时前
Automa-RPA实现京东商品自动搜索
后端
肖笙XiaoSheng3 小时前
用Gemini调整我的定时任务代码
后端·aigc·ai编程
李明卫杭州3 小时前
UML中用例图的绘制
架构·uml