2017-06-07 4 views
-1

で選択肢を指定します。私は例えば、選択肢を可能に検証制約を指定する方法を探していますJavaの検証注釈

@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

あなたの正規表現では、 '@Pattern(regexp ="^|(\\ s | \\ d | [ - +:()]){6,20} $ ")'いいえ'@ Size'が必要です。 – VGR

答えて

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(); 
} 

を、あなたが使用することはできません2つの@Sizeアノテーションは@Repeatableアノテーションではないため、@OverridesAttributeでそれらの属性のうちの1つのみの属性をオーバーライドすることはできません。

+1

したがって、 '@ Size'はBean Validation 2.0で' @ Repeatable 'になりますが(HV 6の場合)、 '@ Size'に関連付けられた' List'コンテナを使用することができます。 '@ OverridesAttribute'については、' constraintIndex'を使ってそれを特定の制約に適用することができます。 –