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

标签 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" />

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

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

最佳答案

如果您的 JSF 2 配置将空提交的值解释为 ""而不是 null然后 :
@NotBlank验证器返回 false因为你的注释
字符串为空。
@Max验证器返回 false因为根据休眠实现(我猜你正在使用基于你以前的帖子的休眠实现)。

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 .

您有两种可能的解决方案:
  • 将 JSF 配置为 interpret empty submitted values as null (或)
  • 更改您的领域 name输入数字而不是字符串。
  • 关于jsf - 使用 JSF bean 验证在一个字段上使用多个验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7553796/

    相关文章:

    java - 向 JSF 2.0 页面回显消息

    jsf - 查看范围: java. io.NotSerializedException : javax. faces.component.html.HtmlInputText

    css - 将工具提示添加到子菜单

    java - 在运行时配置约束

    java - JSR-303 附加默认验证消息

    jsf - 为什么即使在服务器重新启动后我的应用程序的值仍会保留?

    jsf - Primefaces ExcelExporter 与 CommandLinks

    jsf - selectBooleanCheckbox 的标签 'for' id 是什么

    java - 如何在事件上调用 jquery 函数?

    spring - SmartValidator - 使用组手动调用验证