在java验证注释中指定备选方案

时间:2017-06-07 09:47:54

标签: java annotations hibernate-validator

我正在寻找一种方法来指定允许替代的验证约束,例如:

@Documented
@Constraint(validatedBy = {})
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Pattern(regexp = "^(\\s|\\d|[-+:()])*$")
@Or( // I'm looking for something like this
    @Size(min = 6, max = 20),
    @Size(min = 0, max = 0)
)
public @interface Phone {
    String message() default "Not a valid phone number";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

是否可以使用java验证工具?

1 个答案:

答案 0 :(得分:0)

我找到了一个涉及创建多个中间注释并使用@ConstraintComposition(CompositionType.OR)的解决方案,但也许有人会提出更好的解决方案。

首先,为替代的单个分支创建注释:

@Documented
@Constraint(validatedBy = {})
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Size(max = 0)
public @interface Empty {
    String message() default "Should be empty string";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

其次,创建另一个注释,将自定义注释与另一个分支组合在一起:

@Documented
@Constraint(validatedBy = {})
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@ConstraintComposition(CompositionType.OR)
@Size
@Empty
public @interface SizeOrEmpty {
    String message() default "Should be empty or have defined size";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    @OverridesAttribute(constraint = Size.class, name = "min") int min();

    @OverridesAttribute(constraint = Size.class, name = "max") int max();
}

不幸的是,您不能使用两个@Size注释,因为它不是@Repeatable注释,其次,您不能使用@OverridesAttribute仅覆盖其中一个属性。