使用JSF bean验证在一个字段上的多个验证器

时间:2011-09-26 10:34:01

标签: jsf jsf-2 bean-validation hibernate-validator

我正在尝试对一个字段进行多次验证

    @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" />

但是当我将该字段留空时,它会显示两条错误消息。

任何想法如何处理这两种情况,独立验证空和最大长度。

1 个答案:

答案 0 :(得分: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 String参数包含空值(“”),BigDecimal(String)构造函数抛出异常,然后验证器返回false

您有两种可能的解决方案: