实现Java后端数据校验–@Validated分组验证和嵌套验证

  • Post author:
  • Post category:java


最近在使用中遇到了一种情况:

如果是保存按钮,保存内容的表单中的某些字段,如果填了,则不能超过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个字符,则就验证两个分组。



版权声明:本文为run65536原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。