2011-09-26 83 views
7

我試圖讓多個驗證一個一個領域多重驗證與JSF Bean驗證

@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驗證器返回false,因爲根據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字符串參數包含空值(「」),並與BigDecimal(String)構造函數拋出異常,然後驗證返回false

你有兩種可能的解決方案:

+0

很好,趕上!在這種情況下,OP也可以使用'@NotNull'而不是特定於hibernate-impl的'@NotBlank'。 – BalusC