最近在使用中遇到了一种情况:
如果是保存按钮,保存内容的表单中的某些字段,如果填了,则不能超过50个字符,没填的话则跳过验证。
如果是提交按钮,则必须校验不能为空,且也不能超过50个字符。
这个需求需要我进行分组校验,且因为数据结构的关系需要嵌套验证
下文只是我给出的一个简单的例子
SaveGroup是一个空的接口,用来分组
GroupVO 是一个小组的类,它嵌套需要整的Emp用户类
/**
* <p>
*
* @description: 分组拓展
* </p>
* @return: com.emperor.go.po.VO.GroupVO
*/
@Data
public class GroupVO {
/** 等级 */
@NotNull
private Integer level;
/** 分组名 */
@NotEmpty
@Size(max = 50, groups = {SaveGroup.class}, message = "分组名文本过长")
private String name;
/** 简述 */
@NotEmpty
@Size(max = 200, groups = {SaveGroup.class}, message = "简述文本过长")
private String description;
/** 组员 */
private List<@Valid Emp> empList;
}
/**
* <p>
*
* @description: 组员
* </p>
* @return: com.emperor.go.po.VO.Emp
*/
@Data
public class Emp {
private Long id;
@NotEmpty
private String no;
@NotEmpty
private String name;
@Max(value = 60, message = "年龄过大,无法入组", groups = SaveGroup.class)
private Integer age;
}
要点1:
代码中,我将一些保存需要验证长度或者数字大小的字段加入了@Max或 字符串类型使用的@Size,但是我在这个注解上没有加入min,只有max。代表我不限制它在保存的时候可以不填这个值。
要点2:
在嵌套的GroupVO类中,被嵌套的对象List<@Valid Emp>中的注解@Valid很重要,如果不加,在控制层验证数据的时候只有GroupVO本身的参数会验证生效,而Emp里面的几个字段则不会生效。
最后列表一下Controller层的验证
@PostMapping("save")
public ResultBody save(@Validated(SaveGroup.class) GroupVO param){
return ResultBody.success();
}
@PostMapping("submit")
public ResultBody submit(@Validated({SaveGroup.class, Default.class}) GroupVO param){
return ResultBody.success();
}
这段代码中包含最后一个要点:
Default.class 默认的分组接口
Default.class是字段的默认分组,而且是我试出来的(emmmm…不提倡)。根据测试的结果,我理解这个接口的作用是这样:
没有分组的注解会默认获得这个分组
如果字段的某个注解有开发者分组了,则这个字段只会拥有被分配的一个或多个分组,不会有Default分组
也因此在验证提交时,GroupVO的name、description字段不能为空,也不能超过50个字符,则就验证两个分组。