当使用javax验证中的自定义约束时,我们有以下问题。我们有多种类型的ID,我们想用几个参数来验证。在这里,我们希望应用继承,从而删除大量重复的代码。但是,混合继承和注解很困难,因此我们使用了验证程序的继承:
@Constraint(validatedBy = { FirstIdValidator.class })
@Target({TYPE, FIELD, PARAMETER, METHOD, CONSTRUCTOR, TYPE_PARAMETER, TYPE_USE})
@Retention(RUNTIME)
public @interface FirstId {
boolean isOptional;
boolean allowFormatted;
//Other fields
}
@Constraint(validatedBy = { SecondIdValidator.class })
@Target({TYPE, FIELD, PARAMETER, METHOD, CONSTRUCTOR, TYPE_PARAMETER, TYPE_USE})
@Retention(RUNTIME)
public @interface SecondId {
boolean isOptional;
boolean allowFormatted;
//Other fields
}
public class FirstIdValidator extends IdValidator<FirstId> {
@Override
public void initialize(final FirstId constraintAnnotation) {
initialize(
"style first id formatted",
"style first id unformatted",
constraintAnnotation.allowFormatted(),
constraintAnnotation.isOptional()
);
}
}
public class SecondIdValidator extends IdValidator<SecondId> {
@Override
public void initialize(final SecondId constraintAnnotation) {
initialize(
"style second id formatted",
"style SecondId id unformatted",
constraintAnnotation.allowFormatted(),
constraintAnnotation.isOptional()
);
}
}
abstract class IdValidator<A extends Annotation> implements javax.validation.ConstraintValidator<A, CharSequence> {
private String idRegex;
private String formattedIdRegex;
private boolean allowFormatted;
private boolean isOptional;
void initialize(final String idRegex, final String formattedIdRegex, final boolean allowFormatted, final boolean isOptional) {
this.idRegex = idRegex;
this.formattedIdRegex = formattedIdRegex;
this.allowFormatted = allowFormatted;
this.isOptional = isOptional;
}
@Override
protected boolean isValid(final CharSequence id, javax.validation.ConstraintValidatorContext context) {
//Logic to check if it is valid
}
}
这不是一个很好的解决方案,导致多个类没有做任何有趣的事情。将其重写为不同场景的多个注解不是一个选择,因为有太多的注解。这是解决这个问题的正确方法还是有更好的方法?
暂无答案!
目前还没有任何答案,快来回答吧!