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

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

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

相关推荐
vipxieliang8 分钟前
Go 泛型结构体与约束进阶:从自定义约束到标准库泛型 API 实战
后端·go
isfox9 分钟前
Python 文件操作:读写文件这件事,记住 with open 就够了
后端
vipxieliang12 分钟前
ValidX 验证器缓存机制:如何提升验证性能
java·spring boot
武子康20 分钟前
虚拟线程不是无限并发:Java Agent 后端真正该限制的是这些资源
人工智能·后端·agent
未秃头的程序猿23 分钟前
Spring Cloud Gateway 做统一加解密,我在请求体上栽了三天
java·后端·架构
Rain的Java大神之路24 分钟前
别再上来就堆 Redis!点赞系统从打挂数据库到 18w 写峰值,我把这套方案讲透了
java·后端·面试
SimonKing27 分钟前
开源文档解析天花板 MinerU 4.0:PDF / 图片 / Office 等任意文档都支持
java·后端·程序员
咖啡八杯32 分钟前
Spring MessageSource 国际化消息解析流程
java·后端·spring·架构·框架·若依
念何架构之路42 分钟前
go-grpc逻辑架构图
开发语言·后端·golang