我想为输入字段创建验证器,以便检查值并在插入的值不是int时发送错误消息。
豆:
public class PricingCalculatorValidator implements Validator
{
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException
{
// Cast the value of the entered input to String.
String input = (String) value;
// Check if they both are filled in.
if (input == null || input.isEmpty())
{
return; // Let required="true" do its job.
}
// Compare the input with the confirm input.
if (containsDigit(input))
{
throw new ValidatorException(new FacesMessage("Value is not number."));
}
}
public final boolean containsDigit(String s)
{
boolean containsDigit = false;
if (s != null && !s.isEmpty())
{
for (char c : s.toCharArray())
{
if (containsDigit = Character.isDigit(c))
{
break;
}
}
}
return containsDigit;
}
}
投射插入值的正确方法是什么?现在我得到了异常
serverError: class java.lang.ClassCastException java.lang.Integer cannot be cast to java.lang.String
答案 0 :(得分:3)
根据例外情况,JSF实际上将Integer
实例作为value
传递给validate()
方法。从技术上讲,您应该将其转换为Integer
,如下所示,以保持Java运行时的快乐。
// Cast the value of the entered input to Integer.
Integer input = (Integer) value;
显然你已经将输入字段绑定到模型中的Integer
属性,如下所示:
<h:inputText value="#{bean.pricing}" />
private Integer pricing;
换句话说,整个自定义验证器是不必要的。如果值是一个整数(如果它已经是Integer
,则没有必要验证该值是否为整数。它可能不可能包含非数字值。
完全摆脱那个自定义验证器。
JSF对Integer
等标准类型有几个builtin converters,它们会根据模型值类型自动运行。并且,转换器在验证器之前运行。这就是为什么价值已经在您的自定义验证器中以Integer
的形式到达的原因。您的自定义验证器中唯一似乎相关的是错误消息,它与标准转换错误消息不同。如果您merely想要在特定输入字段上自定义转化错误消息,只需在输入字段中将其设置为converterMessage
属性。
<h:inputText value="#{bean.pricing}" converterMessage="Value is not numeric." />
无关具体问题,&#34;验证&#34;如果值表示有效Integer
(此过程在JSF中实际上称为转换,并且应该在custom converter中进行)可以以更简单的方式执行:
String string = getItSomehowWithoutClassCastException();
try {
Integer integer = Integer.valueOf(string);
} catch (NumberFormatException e) {
throw new ConverterException(new FacesMessage("Value is not an integer."));
}
如果您最终想获得Integer
,则无需检查每一位数字。如上所述,JSF builtin converter已经解决了这个问题。
答案 1 :(得分:1)
您不必验证每个角色。 只需执行:
boolean isDigit = true;
try {
new Integer(input).intValue();
} catch (NumberFormatException nfe) {
isDigit = false;
}
如果输入中的任何字符不是数字,则执行catch块,否则将跳过该块。 最后,isDigit告诉您输入是否为整数。 请注意,如果您的输入数字太多而不是整数,它也会告诉您输入不是整数,即使每个字符都是一个数字。