如何在 JSF 页面中使用 validateRegex 验证数字字段?

问题描述 投票:0回答:3

在托管 bean 中,我有一个 int 类型的属性。

@ManagedBean
@SessionScoped
public class Nacharbeit implements Serializable {

private int number;

在 JSF 页面中,我尝试仅验证 6 位数字输入的此属性

               <h:inputText id="number"
                         label="Auftragsnummer"
                         value="#{myController.nacharbeit.number}"
                         required="true">
                <f:validateRegex pattern="(^[1-9]{6}$)" />
            </h:inputText>

在运行时我遇到异常:

javax.servlet.ServletException: java.lang.Integer cannot be cast to java.lang.String

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

正则表达式是否错误?或者 ValidateRegex 仅适用于字符串?

regex validation jsf
3个回答
25
投票

<f:validateRegex>
仅用于
String
属性。但是您有一个
int
属性,JSF 在验证之前已经将提交的
String
值转换为
Integer
。这解释了您所看到的异常。

但是由于您已经在使用

int
属性,因此当您输入非数字时,您已经收到转换错误。转换错误消息可以通过
converterMessage
属性进行配置。所以你根本不需要使用正则表达式。

对于具体的功能需求,您似乎想验证最小/最大长度。为此,您应该使用

<f:validateLength>
来代替。将此属性与
maxlength
属性结合使用,这样最终用户无论如何都无法输入超过 6 个字符。

<h:inputText value="#{bean.number}" maxlength="6">
    <f:validateLength minimum="6" maximum="6" />
</h:inputText>

您可以通过

validatorMessage
顺便配置验证错误消息。所以,总而言之,它可能看起来像这样:

<h:inputText value="#{bean.number}" maxlength="6"
    converterMessage="Please enter digits only."
    validatorMessage="Please enter 6 digits.">
    <f:validateLength minimum="6" maximum="6" />
</h:inputText>

1
投票

您也可以在没有正则表达式的情况下实现此目的

验证 int 值:

<h:form id="user-form">  
    <h:outputLabel for="name">Provide Amount to Withdraw  </h:outputLabel><br/>  
    <h:inputText id="age" value="#{user.amount}" validatorMessage="You can Withdraw only between $100 and $5000">  
    <f:validateLongRange minimum="100" maximum="5000" />  
    </h:inputText><br/>  
    <h:commandButton value="OK" action="response.xhtml"></h:commandButton>  
</h:form> 

验证浮点值:

<h:form id="user-form">  
    <h:outputLabel for="amount">Enter Amount </h:outputLabel>  
    <h:inputText id="name-id" value="#{user.amount}" validatorMessage="Please enter amount between 1000.50 and 5000.99">  
    <f:validateDoubleRange minimum="1000.50" maximum="5000.99"/>  
    </h:inputText><br/><br/>  
    <h:commandButton value="Submit" action="response.xhtml"></h:commandButton>
</h:form>  

0
投票

我们需要使用 validateRegex 验证数字字段

我们是这样做的

    public class CustomNumberConverter extends NumberConverter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (StringUtils.isEmpty(value) || StringUtils.isBlank(value)) {
            return null;
        }

        //needed to raise an error when the number comes with trailing letters 
        if (!value.matches("^[\\d,\\.\\s]+$")) {
            throw new ConverterException("");
        }
        return super.getAsObject(context, component, value);
    }
}

然后注册自定义转换器,别忘了添加基础转换器支持的参数

<converter>
    <converter-id>project.converter.customnumberconverter</converter-id>
    <converter-class>com.web.project.converters.CustomNumberConverter</converter-class>
    <property>
        <property-name>pattern</property-name>
        <property-class>java.lang.String</property-class>
    </property>
    <property>
        <property-name>maxIntegerDigits</property-name>
        <property-class>java.lang.Integer</property-class>
    </property>
    <property>
        <property-name>minFractionDigits</property-name>
        <property-class>java.lang.Integer</property-class>
    </property>
</converter>

<tag>
    <tag-name>customConvertNumber</tag-name>
    <converter>
        <converter-id>project.converter.customnumberconverter</converter-id>
    </converter>
</tag>

最后在视图中使用自定义转换器

<p:inputText
    value="#{controller.inputValue}"
    maxlength="35"
>
    <f:validateDoubleRange minimum="0" maximum="9999999999" />
    <s:customConvertNumber pattern="0.00" maxFractionDigits="2" minFractionDigits="2" />
</p:inputText>

控制器中使用的inputValue是一个字符串,以克服COERCE_ZERO问题(primefaces版本3.2)

© www.soinside.com 2019 - 2024. All rights reserved.