JSF Bean Validation中一个字段上存在多个验证器

7
我正在尝试在一个字段上实现多个验证。
    @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" />

但是当我将字段留空时,它会显示两个错误信息。有什么办法可以独立验证空值和最大长度呢?请给出建议。

很奇怪,我不知道为什么,但当我使用@Size并给它最大值时,一切都按预期工作了,有什么想法吗? - Mahmoud Saleh
1
@Size@Max不是同一个东西。@Size验证字符串输入值的长度。@Max验证任何数字输入值的数值。例如,26在@Max(25)中无法通过验证。 - BalusC
1个回答

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
您有两个可能的解决方案:

好的发现!在这种情况下,OP也可以只使用@NotNull而不是hibernate-impl特定的@NotBlank - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接