【问题标题】:Multiple validators on one field with JSF bean validation使用 JSF bean 验证的一个字段上的多个验证器
【发布时间】:2011-09-26 10:34:00
【问题描述】:

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

    @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 并给它最大时,一切都按预期工作,有什么想法吗?
  • @Size@Max 不一样。 @Size 验证字符串输入值的长度。 @Max 验证任何数字输入值的数值。例如。 26 不会通过@Max(25)

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


【解决方案1】:

如果您的 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

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

【讨论】:

  • 不错的收获!在这种情况下,OP 也可以只使用 @NotNull 而不是 hibernate-impl-specific @NotBlank
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-28
  • 2011-01-29
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多