使用类级验证对约束进行分组

时间:2019-10-03 15:01:48

标签: java validation constraints bean-validation validationgroup

我正在尝试将分组约束与类级别的注释一起使用。

我有一个用例,其中2个对象属于相同的“示例”类型。

public class MyUseCase {
    @Valid
    private final Example sourceDetail;
    @Valid
    private final Example destinationDetail;
}

下面定义了Example和BaseExample(Example的父级)。 “示例”包含名为field1和field2的字段。 对sourceDetail的验证仅取决于field1,而对destinationDetail的验证取决于field1和field2。另一个问题是错误消息。 sourceDetail和destinationDetail对象验证存在不同的错误消息。

public class BaseExample {

    @AlphaNumeric(message = "sample error 1")
    private String field1;
}

public class Example extends BaseExample {

    @AlphaNumeric(min = 9, max = 9, message = "sample error 2")
    private final String field2;

    @NotNull(message="sample error 3", groups = SomeOtherGroup.class)
    private final String anotherRandomField;

}

为解决此问题,我尝试了很多事情。

使用传递的组创建了两个类级别的自定义约束。

@DestinationCheck(groups={DestinationGroup.class})
@SourceCheck(groups={SourceGroup.class})
public class Example extends BaseExample {
    // code
}

public @interface SourceCheck {
    String message() default "some message";
    Class<?>[] groups();  // no default group
    Class<? extends Payload>[] payload() default {};
}

public @interface DestinationCheck {
    String message() default "some other message";
    Class<?>[] groups(); // no default group
    Class<? extends Payload>[] payload() default {};
}

public class SourceCheckValidator implements ConstraintValidator<SourceCheck, Example> {

    @Override
    public void initialize(SourceCheck sourceCheck) {
    }

    @Override
    public boolean isValid(Example example, ConstraintValidatorContext context) {
        // validation check to ensure just field1 is compulsory
    }
}

public class DestinationCheckValidator implements ConstraintValidator<DestinationCheck, Example> {

    @Override
    public void initialize(DestinationCheck destinationCheck) {
    }

    @Override
    public boolean isValid(Example example, ConstraintValidatorContext context) {
        // validation check to ensure only one of field1 or field2 is present
    }
}

最后,我使用以下命令在解串器中测试了验证:

// exampleName can be either "sourceDetail" or "destinationDetail"
// jsonParser and jsonNode are available via deserializer
example = jsonParser.getCodec().treeToValue(jsonNode.get(exampleName),
            Example.class);
if ("sourceDetail".equals(exampleName))
    validator.validate(example, SourceGroup.class);
if ("destinationDetail".equals(exampleName))
    validator.validate(example, DestinationGroup.class);

我希望这能验证sourceDetail'example'对象,但相反,它会在validator.validate()步骤中引发NullPointerException。

a。这里缺少的是什么?我也按预期将组传递给注释。小组的通过方式有问题吗?

b。组是否可以通过这种方式使用?如果不能,那么如果无法更改模型,什么是解决此问题的理想方法?

我还尝试仅使用一个批注来验证sourceDetail和destinationDetail对象。我的注释:

    @OverallCheck(groups={SourceGroup.class, DestinationGroup.class})

在约束验证器中,我有:

@Override
public void initialize(OverallCheck overallCheck) {
    String group = overallCheck.groups(). <---- ????
}

但是,这里的问题是无法使用验证组,即使用SourceGroup.class还是DestinationGroup.class,否则,我可以处理该组isValid()方法中的逻辑。

0 个答案:

没有答案
相关问题