有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

jsf服务器错误:类java。ClassCastException java。无法将lang.Integer转换为java。串

我想为输入字段创建验证器,以便检查值,如果插入的值不是int,则发送错误消息

bean:

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

共 (2) 个答案

  1. # 1 楼答案

    您不必验证每个字符。 只要表演:

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

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

  2. # 2 楼答案

    根据异常情况,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."));
    }
    

    如果你最终想要得到一个^{,就不需要检查每一个数字。如前所述,JSF builtin converter已经解决了这个问题