0

在使用来自 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
    }
}

这不是一个很好的解决方案,并导致多个类没有做任何有趣的事情。将其重写为针对不同场景的多个注释不是一种选择,因为太多了。这是解决这个问题的正确方法还是有更好的方法来解决这个问题?

4

0 回答 0