2012-02-13 10 views
7

私はSpring 3アノテーションベースの検証を使用しています。私は@Null@NotEmptyのような注釈を知っているが、私は両方を使用する方法をおよび/またはSpringアノテーションベースの検証の条件

フィールドは、それが非空の文字列に

が含まれている必要がありnullまたはできる文字列フィールドに次の検証を追加しますOR条件?


ソリューション:@Size(min=1)を使用して

ができますが、それはスペースを扱うことができません。したがって、nullを許可するカスタム注釈NotBlankOrNullを追加し、空でない文字列も空白を考慮します。ありがとう@ラルフ。
はここ

@Documented 
@Constraint(validatedBy = { NotBlankOrNullValidator.class }) 
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
@Retention(RUNTIME) 
public @interface NotBlankOrNull { 
    String message() default "{org.hibernate.validator.constraints.NotBlankOrNull.message}"; 

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

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

Validatorクラス私の注釈私はまた私のsiteにそれを更新した

public class NotBlankOrNullValidator implements ConstraintValidator<NotBlankOrNull, String> { 

    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { 
     if (s == null) { 
      return true; 
     } 
     return s.trim().length() > 0; 
    } 

    @Override 
    public void initialize(NotBlankOrNull constraint) { 

    } 
} 

です。

答えて

5

まず、Springアノテーションベースの検証ではなく、JSR 303 Bean検証であり、たとえばHibernate Validationによって実装されています。実際には春には関係ありません。/

注釈をOR方法で結合することはできません。

しかし、最も基本的な検証では有効な入力としてnullを受け入れるため、単純な回避策があります(したがって、基本的な検証と追加の@NotNullを組み合わせる必要があります。あなたが尋ねたものではありません)。

例: @javax.validation.constraints.Size有効な入力としてnullを受け入れます。

だから、@NotEmptyの代わりに@Size(min=1)を使用してください。ところで

:未@NotEmptyはあなた自身でそれを実装除い@NotNull@Size(min = 1)

だけの組み合わせ*です。

+0

4つの提案と私を修正してくれてありがとう。 '@Size(min = 1)'を試しました。これは 'null'と空ではない文字列で動作します。ユーザーがスペースを入力した場合の対処方法が不思議です。 – xyz

+0

@Ajinkya:NotBlank Annotationのソースコードを見てください。再び、それはNotNullでアノテートされます。しかし、それはnotBlankValidatorによって検証されています。(例外的に、NotBlankValidatorはnullに対してtrue(有効)を返します)。あなた自身の注釈が必要ですが、バリデータの実装を再利用することができます> @Constraint(validatedBy = {NotBlankValidator.class})@ Target ... @ Retention ... public @interface NotBlankOrNull' – Ralph

+0

ありがとうたくさんの男:) – xyz

関連する問題