问题描述
使用来自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,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.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
}
}
这不是一个很好的解决方案,并导致多个类没有任何有趣的作用。对于不同的情况,将其重写为多个注释是不可行的,因为方法太多了。这是解决此问题的正确方法,还是有更好的解决方法?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)