springboot分组校验

1、分组校验场景

        主要2个场景,场景1:多个接口使用相同的入参,不同接口需要校验的内容不同。场景2:针对同一个接口,某个值(一般是类型)的不同会影响其他值的内容,此时需要根据某个值的内容来做不通的校验。

场景1(不同接口,相同入参,不同接口校验不同的内容)

入参类:

@Data
public class StudentReq {
    @NotNull(message = "id不能为空", groups = StudentValidator.Update.class)
    private String id;

    @NotNull(message = "性别不能为空", groups = StudentValidator.Insert.class)
    private String sex;

    private String project;
}

校验标识类

public class StudentValidator {
    public interface Insert{
    }

    public interface Update{
    }
}

2个接口

    /**
     * 通过接口实现不同的校验(接口维度)
     */
    @PostMapping("/test/validate/insert")
    public String insert(@RequestBody @Validated(StudentValidator.Insert.class) StudentReq studentReq) {
        return "insert";
    }

     /**
      * 通过接口实现不同的校验(接口维度)
      */
    @PostMapping("/test/validate/update")
    public String update(@RequestBody @Validated(StudentValidator.Update.class) StudentReq studentReq) {
        return "update";
    }

接口insert和update的入参都是StudentReq,其中的字段id和sex分别被注解StudentValidator.Update.class和StudentValidator.Insert.class表示,同时接口层面也使用了注解标识。则接口会校验被标识的字段。

运行结果

insert接口:

springboot分组校验_第1张图片

 update接口

springboot分组校验_第2张图片

场景2(入参的某值不同导致校验其他值的逻辑变化)

入参:

@Data
@GroupSequenceProvider(StudentWorkValidateProvider.class)
public class StudentWorkReq {
    @NotNull(message = "数学竞赛证书不能为空", groups = StudentWorkValidator.Math.class)
    private String mathCertificate;

    @NotNull(message = "计算机证书不能为空", groups = StudentWorkValidator.Computer.class)
    private String computerCertificate;

    private String project;
}

校验标识类

public class StudentWorkValidator {
    public interface Math{
    }

    public interface Computer{
    }
}

校验序列类:如果参数studentWorkReq的值是math时,则mathCertification不能为空。如果取值是computer,则computerCertification不能为空

public class StudentWorkValidateProvider implements DefaultGroupSequenceProvider {
    @Override
    public List> getValidationGroups(StudentWorkReq studentWorkReq) {
        List> defaultGroupSequence = new ArrayList<>();
        defaultGroupSequence.add(StudentWorkReq.class);
        if (Objects.isNull(studentWorkReq)) {
            return defaultGroupSequence;
        }

        if (studentWorkReq.getProject().equals("math")) {
            defaultGroupSequence.add(StudentWorkValidator.Math.class);
        } else if (studentWorkReq.getProject().equals("computer")) {
            defaultGroupSequence.add(StudentWorkValidator.Computer.class);
        }
        return defaultGroupSequence;
    }
}

接口

    /**
     * 通过接口参数实现不同的校验(参数维度)
     */
    @PostMapping("/work/validate/update")
    public String work(@RequestBody @Validated StudentWorkReq studentWorkReq) {
        return "work";
    }

运行结果

project传值math,mathCertification为空,则校验如下

springboot分组校验_第3张图片

 project传值computer,computerCertification为空,则校验如下

springboot分组校验_第4张图片

3、小结

2种场景,接口维度做不通校验和按照某个入参值(比如类型、类别能具有可列举属性的值)维度做不通校验

你可能感兴趣的:(spring,boot,java,spring)