我正在尝试将分组约束与类级别的注释一起使用。
我有一个用例,其中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()方法中的逻辑。