2011-09-26 6 views
7

で一つのフィールドにバリデータ1つのフィールド複数のIは、複数の検証をしようとしていますJSFビーン検証

@NotBlank(message = "{name.required}") 
    @Max(value = 25, message = "{long.value}") 
    public String name; 

JSF:

<h:inputText id="name" value="#{person.name}" size="20"> 
</h:inputText> 
<h:message for="name" style="color:red" /> 

が、私は空のフィールドを離れるとき、それは両方のエラーを示していメッセージ。

どのようにして両方のケースを処理し、空と最大長を個別に検証するかについての考え方。

+0

私は@Sizeを使用して最大値を与えると、それは何かが分かりません。 –

+1

'@ Size'と' @ Max'は同じではありません。 '@ Size'は文字列入力値の長さを検証します。 '@ Max'は任意の数値入力値の数値を検証します。例えば。 26は '@Max(25)'を渡しません。 – BalusC

答えて

5

あなたのJSF 2の構成は、""として空送信された値を解釈していないnull場合:あなたの注釈付き 文字列が空であるため、

@NotBlankバリデータがfalseを返します。

@Maxバリデーターはを返します。これは、hibernateの実装(以前の投稿では、hibernate実装のベースを使用していると思います)のためです。あなたのケースでは

public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { 
     //null values are valid 
     if (value == null) { 
      return true; 
     } 
     try { 
      return new BigDecimal(value).compareTo(BigDecimal.valueOf(maxValue)) != 1; 
     } 
     catch (NumberFormatException nfe) { 
      return false; 
     } 
    } 

value Stringパラメータが含まれている空の値(「」)とのBigDecimal(String)コンストラクタが例外をスローして、バリデータはfalseを返します。

あなたは2つの解決策があります:interpret empty submitted values as null(または) に

  • 設定JSFは、文字列ではなく数値のためにあなたのフィールドname種類を変更し
+0

ニースキャッチ!その場合、OPはhibernate-impl固有の '@ NotBlank'の代わりに' @ NotNull'を使うこともできます。 – BalusC

関連する問題