【问题标题】:serverError: class java.lang.ClassCastException java.lang.Integer cannot be cast to java.lang.StringserverError:类 java.lang.ClassCastException java.lang.Integer 无法转换为 java.lang.String
【发布时间】:2015-06-24 20:33:51
【问题描述】:

我想为输入字段创建验证器,以便检查值并在插入的值不是 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

【问题讨论】:

  • 我认为正确的方法是使用转换器。例如,您可以使用f:convertNumber。
  • 看起来你的 value 参数是 Integer 类型的。在那种情况下String input = (String) value; 这将不起作用。如果你想把它转换成String,你可以试试value.toString();。这将为您提供String 代表Integer 值。

标签: java jsf


【解决方案1】:

作为例外,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 有几个builtin converters 用于标准类型,例如Integer,它们会根据模型值类型自动运行。而且,转换器在验证器之前运行。这就是为什么值已经在您的自定义验证器中以Integer 的形式出现。在您的自定义验证器中似乎唯一相关的是与标准转换错误消息不同的错误消息。如果您merely 想在特定输入字段上自定义转换错误消息,只需在输入字段上将其设置为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 已经解决了这个问题。

【讨论】:

  • 一个小问题:我有一个包含 20 个输入字段的表单。如果我在每个字段中插入错误值,则只会显示最后一条错误消息。只要输入字段中有错误值,我如何显示错误消息?
  • 取决于您如何更新/显示错误消息。这与当前问题无关。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多