验证JSF中的小数输入

cca*_*333 3 validation jsf

我想将输入验证为整数.因此,应过滤具有小数部分的任何值.但我不知道如何实现这一目标.我尝试了很多东西,但是使用下面的代码,如果输入是"61.2",则值将转换为61,只是截断小数部分.但我想强制验证错误.我相信没有自定义验证器我就能做到.谢谢

<p:inputText size="5" value="#{bean.intValue}"  converter="#{Integer}">
    <f:convertNumber pattern="#0" integerOnly="true" maxFractionDigits="0"/>
</p:inputText>
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 12

这不可能在转换后运行验证.您基本上需要将它绑定到String属性而不是一个属性,Integer以验证未转换的值.您需要在属性设置器或托管bean操作方法中转换它.所以,如果你把它作为一个String属性,你可以使用<f:validateRegex>它.

<h:inputText value="#{bean.input}" validatorMessage="Please enter digits only">
    <f:validateRegex pattern="\d*" />
</h:inputText>
Run Code Online (Sandbox Code Playgroud)

或者,IMO比在setter或action方法中手动转换它更好,你可以引入一个自定义转换器,扩展JSF标准IntegerConverter并在转换发生之前验证其中的模式.

@FacesConverter("digitsOnly")
public class DigitsOnlyConverter extends IntegerConverter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException {
        if (!value.matches("\\d*")) {
            throw new ConverterException();
        }

        return super.getAsObject(context, component, value);
    }

}
Run Code Online (Sandbox Code Playgroud)

<h:inputText value="#{bean.input}" converterMessage="Please enter digits only">
    <f:converter converterId="digitsOnly" />
<h:inputText>
Run Code Online (Sandbox Code Playgroud)