Java 多约束验证器及其优先级的实现(通过端点请求启用/禁用)

Java 多约束验证器及其优先级的实现(通过端点请求启用/禁用),java,spring,spring-boot,validation,hibernate-validator,Java,Spring,Spring Boot,Validation,Hibernate Validator,假设我有一个对象,其中有两个字段需要验证: public class AnyRQ { @MerchantAccountValidation @JsonProperty(value = "merchant-account") private MerchantAccount merchantAccount; @RequestIdValidation @JsonProperty(value = "request-

假设我有一个对象,其中有两个字段需要验证:

public class AnyRQ {
    
    @MerchantAccountValidation
    @JsonProperty(value = "merchant-account")
    private MerchantAccount merchantAccount;
    
    @RequestIdValidation
    @JsonProperty(value = "request-id")
    private String requestId;

}
注释
@MerchantAccountValidation
@RequestIdValidation
都实现了一个
约束验证器
,并包含有效与否的规则。(只显示一个类)

有没有办法获得某种优先权或继承权以使其正常工作?我正在考虑在端点的方法级别上进行验证注释。但不幸的是,这不起作用。

帕特里克

为了达到预期的效果,可以使用@GroupSequence。它主要用于排序验证(若id为null f.e.,则无需检查数据库中是否存在实体),但可以用于您的任务。 假设您有2个验证组(需要更好的名称:):

在DTO中指定它们:

public class AnyRQ {

@MerchantAccountValidation(groups = FullValidation.class)
@JsonProperty(value = "merchant-account")
private MerchantAccount merchantAccount;

@RequestIdValidation(groups = {InitialValidation.class, FullValidation.class})
@JsonProperty(value = "request-id")
private String requestId;

}
在控制器中,使用@Validated而不是@Valid来提供相应的组:

@RestController
@请求映射(“/validate”) 公共类有效控制器{

@PostMapping("/endpoint1")
public ResponseEntity<?> register(@Validated(FullValidationGroup.class) @RequestBody AnyRQ req, Errors errors) {
     if (errors.hasErrors()) {
     }
    return null;
}

@PostMapping("/endpoint2")
public ResponseEntity<?> authorization(@Validated(InitialValidationGroup.class) @RequestBody AnyRQ req, Errors errors) {
     if (errors.hasErrors()) {
     }
    return null;
}
}
@PostMapping(/endpoint1”)
公共响应属性寄存器(@Validated(FullValidationGroup.class)@RequestBody AnyRQ req,Errors){
if(errors.hasErrors()){
}
返回null;
}
@后映射(“/endpoint2”)
公共响应身份授权(@Validated(InitialValidationGroup.class)@RequestBody AnyRQ req,Errors){
if(errors.hasErrors()){
}
返回null;
}
}
另一个选项是在DTO中保留一个组,但在控制器中为@Validated指定两个组

public class AnyRQ {

@MerchantAccountValidation(groups = FullValidation.class)
@JsonProperty(value = "merchant-account")
private MerchantAccount merchantAccount;

@RequestIdValidation(groups = {InitialValidation.class, FullValidation.class})
@JsonProperty(value = "request-id")
private String requestId;

}
@RestController
@PostMapping("/endpoint1")
public ResponseEntity<?> register(@Validated(FullValidationGroup.class) @RequestBody AnyRQ req, Errors errors) {
     if (errors.hasErrors()) {
     }
    return null;
}

@PostMapping("/endpoint2")
public ResponseEntity<?> authorization(@Validated(InitialValidationGroup.class) @RequestBody AnyRQ req, Errors errors) {
     if (errors.hasErrors()) {
     }
    return null;
}
}