验证结果错误的验证器

时间:2011-07-23 08:45:24

标签: java jsf-2

我正在使用JSF2.0 / primefaces

我想创建一个验证器,验证器应验证输入文本的格式(输入的类型为整数)。问题是验证器始终显示Not valid

这是验证器:

public void validateInputHours(FacesContext context, UIComponent component,
    Object value) throws ValidatorException {
Pattern p = Pattern.compile("[0-24]");
Matcher m = p.matcher((String) value);
if (!m.matches())
    throw new ValidatorException(new FacesMessage(
            FacesMessage.SEVERITY_ERROR, "Not valid",
            "Not valid"));
}

输入文字:

<p:inputText  validator="#{Control.validateInputHours}" style="width: 18px"/>

2 个答案:

答案 0 :(得分:2)

你说:

  

验证器应验证输入文本的格式(输入的类型为整数)

然后验证器执行:

Matcher m = p.matcher((String) value);

如果您尝试将整数转换为String,则会导致ClassCastException被抛出。我怀疑你正在某处“吃掉”ClassCastException,并且你发出了一个值为Not valid的通用消息。

例如,以下片段有效(针对Primefaces 3.0M2):


Facelet:

<h:form>
    <p:inputText value="#{control.value}"  validator="#{control.validateInputHours}" style="width: 18px"/>
    <h:commandButton action="#{control.process}" />
    <h:messages globalOnly="true" />
</h:form>

Managed Bean:

private int value;

public int getValue() {
    return value;
}

public void setValue(int value) {
    this.value = value;
}

...
public void validateInputHours(FacesContext context, UIComponent component,
        Object value) throws ValidatorException {
    Integer hours = (Integer) value; // the value will be the value from the model after the Apply-Request-Values phase is complete
    if (hours < 0 || hours > 24) {
        throw new ValidatorException(new FacesMessage(
                FacesMessage.SEVERITY_ERROR, "Not valid",
                "Not valid"));
    }
}

如果您想针对正则表达式检查value的格式,那么它在模型中的表示应该是String,而不是Integer / int 。 Jon Skeet的答案再次有效。 [0-24]不会按照您的想法行事。

答案 1 :(得分:1)

您的正则表达式只匹配一个数字,'0','1','2'或'4'。我怀疑这不是你想要的。

我怀疑你想要这样的东西:

[0-9]|([01][0-9])|(2[0-3])

因此,它将匹配单个数字0-9,或00-19或20-23。 (目前不允许24个 - 如果你真的想要将24作为有效值,将最终的“3”更改为“4”。)

这是假设我的正则表达式是正确的 - 它将是类似的东西。如果你真的想要使用正则表达式,那么另一种方法是尝试将值解析为整数,然后检查它是否在正确的范围内。

最后,我希望有一个开源库可以用非常简单的方式为你处理这类事情 - 值得检查一下你是不是要重新发明轮子......