在java验证注释中指定替代项

在java验证注释中指定替代项,java,annotations,hibernate-validator,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 @Siz

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

@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 {};
}
@已记录
@约束(validatedBy={})
@目标({方法,字段,注释类型,构造函数,参数})
@保留(运行时)
@模式(regexp=“^(\\s |\\d |[-+:())*$”)
@或者(//我在找这样的东西
@尺寸(最小值为6,最大值为20),
@尺寸(最小值=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 {};
}
@已记录
@约束(validatedBy={})
@目标({方法,字段,注释类型,构造函数,参数})
@保留(运行时)
@尺寸(最大值=0)
公共@接口为空{
字符串消息()默认值“应为空字符串”;
类[]组()默认值{};
类[]组()默认值{};

ClassSo
@Size
在Bean Validation 2.0中是可重复的(HV 6也是如此)但是现在,您可以使用与
@Size
关联的
列表
容器。关于
@OverridesAttribute
,您可以使用
约束索引
将其应用于特定约束。在您的情况下,正则表达式可以覆盖它:
@Pattern(regexp=“^ |(\\s|\\d |[-+:()]){6,20})
不需要
@Size
@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();
}