自学内容网 自学内容网

@Validated 根据字段的值不同,动态分组校验

@GroupSequenceProvider 配置

作用域只在单个对象的字段里

@Data
@GroupSequenceProvider(value = TestProvider.class)
public class TestRO {
    @NotNull(message = "不能为空",groups = ValidatedRemark.A.class)
    @Pattern(regexp ="2|3|",message = "只能为2,3,空",groups = ValidatedRemark.B.class)
    private  String str;

控制层

    @PostMapping("/test")
    @ApiOperation("测试请求")
    public AjaxResult test(@RequestBody @Validated TestRO ro){

根据字段的值分配校验的顺序

import java.util.ArrayList;
import java.util.List;

public class TestProvider implements DefaultGroupSequenceProvider<TestRO> {

        @Override
        public List<Class<?>> getValidationGroups(TestRO ro) {
            List<Class<?>> defaultGroupSequence = new ArrayList<>();
            defaultGroupSequence.add(TestRO.class);
            if (null==ro) {
                return defaultGroupSequence;
            }

            String xxxType = ro.getXxx();
//判断的业务逻辑
            if (ro != null && StringUtils.isNotEmpty(xxxType ) ) {
                if (A.equals(xxxType )) {
                    defaultGroupSequence.add(ValidatedRemark.A.class);
                }else if(B.equals(xxxType )){
                    defaultGroupSequence.add(ValidatedRemark.B.class);
                }

            }
            return defaultGroupSequence;
        }
}

注意事项

如果还包含其他对象,需要对每个对象都加上 @GroupSequenceProvider 和对应的 Provider类

可以加上AOP 把要判断的字段值赋 传递给 包含的其他对象

也可以对这个字段加上必填校验,让前端传值

也可以前面加上非空判断,包含其他对象的对应的 Provider类里加上非空判断就走 分组校验

    @Valid
    @NotNull(message = "ddd不能为空",groups = ValidatedRemark.A.class)
    private Dddd ddd;

    @NotNull(message = "list不能为空",groups = ValidatedRemark.A.class)
    @Size(min = 1,message = "list里至少一个对象",groups = ValidatedRemark.A.class)
    private List<@Valid Cccc> ccccList;

官网


原文地址:https://blog.csdn.net/qq56477643/article/details/140181867

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!