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.验证
正常:请求中传递地址名称
异常:请求中不传递地址名称