2015-06-24 67 views
1

我想为输入字段创建验证器,以检查值并在插入的值不是int时发送错误消息。serverError:类java.lang.ClassCastException java.lang.Integer不能转换为java.lang.String

豆:

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

我认为正确的方法是使用转换器。例如,你可以使用'f:convertNumber'。 – Diego

+0

看起来像您的值参数即将到来的类型'整数'。在这种情况下'String input =(String)value;'这不起作用。如果你想把它转换为'String',你可以尝试'value.toString();'。这会给你'Integer'值的'String'表示。 –

回答

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,那么这个值是不是一个整数。它可能不可能包含非数字值。

完全摆脱那个自定义验证器。

对于像Integer这样的标准类型,JSF有几个builtin converters,它们根据型号值类型自动运行。而且,转换器在验证器之前运行。这就是为什么在您的自定义验证器中,该值已经达到Integer。唯一与您的自定义验证程序相关的东西是与标准转换错误消息不同的错误消息。如果您想要在特定输入字段上自定义转换错误消息,请在输入字段中将其设置为converterMessage属性。

<h:inputText value="#{bean.pricing}" converterMessage="Value is not numeric." /> 

无关的具体问题,“验证”如果值代表有效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已经处理这个问题。

+0

一个小问题:我有一个有20个输入字段的表单。如果我在每个字段中插入错误值,则只显示最后一条错误消息。只要输入字段中存在错误的值,我如何显示错误消息? –

+0

取决于您如何更新/显示错误消息。这与当前的问题无关。 – BalusC

1

您不必验证每个字符。 只需执行:

boolean isDigit = true; 
try { 
    new Integer(input).intValue(); 
} catch (NumberFormatException nfe) { 
    isDigit = false; 
} 

如果任何在输入的字符的不是数字,catch块将被执行,否则,该块将被跳过。 最后,isDigit会告诉您输入是否为整数。 注意,如果你的输入有太多的数字是一个整数,它也会告诉你输入不是一个整数,即使每一个字符都是一个数字。

相关问题