如果我们构建一个自定义JSR 303验证器,有什么办法,我们可以将字段的值传递给验证器而不是字段的名称吗?
这就是我在做什么..
我需要构建一个自定义类级别验证,验证这种情况..
有两个字段A& B其中B是日期字段。如果A的值为1,请验证B不为空且其值为未来日期。
现在,我可以在this帖子之后根据这些要求构建验证。在FutureDateValidator的isValid()方法中,我检查了A的值是否为1,然后检查了日期的有效性。
@CustomFutureDate(first =“dateOption”,second =“date”,message =“这必须是未来的日期。”)
现在我有了一组新的字段C和D,其中D又是日期字段。这次我需要验证D是未来的日期,如果C的值是2.在这种情况下,我不能使用我已经实现的验证器,因为它的第一个字段的值是硬编码的。那么如何解决这个问题,为这两种情况重用相同的验证器。
答案 0 :(得分:0)
不硬编码值1/2使其可自定义:
@CustomFutureDate(first = "dateOption", firstValue = "1", second = "date", message = "This must be a future date.")
要使其正常工作,您需要修改@CustomFutureDate
注释:
public @interface CustomFutureDate {
String first();
String firstValue();
...
}
和实施:
public class CustomFutureDateValidator implements ConstraintValidator<CustomFutureDate, Object> {
private String firstFieldName;
private String firstFieldValue;
...
@Override
public void initialize(final CustomFutureDate constraintAnnotation) {
firstFieldName = constraintAnnotation.first();
firstFieldValue = constraintAnnotation.firstValue();
...
}
@Override
public boolean isValid(final Object value, final ConstraintValidatorContext context) {
// use firstFieldValue member
...
}
}