2011-09-26 159 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