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

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

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

相关推荐
皮皮林5513 小时前
SpringBoot 全局/局部双模式 Gzip 压缩实战:14MB GeoJSON 秒变 3MB
java·spring boot
weixin_456904273 小时前
Spring Boot 用户管理系统
java·spring boot·后端
奔跑吧邓邓子3 小时前
【Java实战㉞】从0到1:Spring Boot Web开发与接口设计实战
java·spring boot·实战·web开发·接口设计
茶本无香4 小时前
深入理解Spring Boot的EnvironmentPostProcessor:环境处理的黑科技
spring boot
奔跑吧邓邓子4 小时前
【Java实战㉝】Spring Boot实战:从入门到自动配置的进阶之路
java·spring boot·实战·自动配置
ONLYOFFICE4 小时前
【技术教程】如何将ONLYOFFICE文档集成到使用Spring Boot框架编写的Java Web应用程序中
java·spring boot·编辑器
眠りたいです4 小时前
基于脚手架微服务的视频点播系统-播放控制部分
c++·qt·ui·微服务·云原生·架构·播放器
cyforkk4 小时前
Spring 异常处理器:从混乱到有序,优雅处理所有异常
java·后端·spring·mvc
程序员爱钓鱼5 小时前
Go语言实战案例-开发一个Markdown转HTML工具
前端·后端·go