微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用约束将继承应用于javax验证

如何解决如何使用约束将继承应用于javax验证

使用来自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 举报,一经查实,本站将立刻删除。