我正在使用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"/>
答案 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”。)
这是假设我的正则表达式是正确的 - 它将是类似的东西。如果你真的想要使用正则表达式,那么另一种方法是尝试将值解析为整数,然后检查它是否在正确的范围内。
最后,我希望有一个开源库可以用非常简单的方式为你处理这类事情 - 值得检查一下你是不是要重新发明轮子......