javax.faces.FacesException: java.lang.ClassCastException: java.lang.String 不能转换为 javax.faces.compone

Posted

技术标签:

【中文标题】javax.faces.FacesException: java.lang.ClassCastException: java.lang.String 不能转换为 javax.faces.component.UIComponent【英文标题】:javax.faces.FacesException: java.lang.ClassCastException: java.lang.String cannot be cast to javax.faces.component.UIComponent 【发布时间】:2012-02-09 16:27:30 【问题描述】:

我的 Java EE Web 应用程序在 Glassfish 2.1 上运行良好。现在我想迁移到 Glassfish 3.1.1

我已按照here提供的修改

我对richfaces的依赖如下:-

   <dependency>
        <groupId>org.richfaces.framework</groupId>
        <artifactId>richfaces-api</artifactId>
        <version>3.3.3.Final</version>
    </dependency>
    <dependency>
        <groupId>org.richfaces.framework</groupId>
        <artifactId>richfaces-impl-jsf2</artifactId>
        <version>3.3.3.Final</version>
    </dependency>
    <dependency>
        <groupId>org.richfaces.ui</groupId>
        <artifactId>richfaces-ui</artifactId>
        <version>3.3.3.Final</version>
    </dependency>

我的 jsf 依赖项是

        <dependency>
            <groupId>com.sun.faces</groupId> 
            <artifactId>jsf-api</artifactId> 
            <version>2.0.2</version> 
        </dependency>
        <dependency>
            <groupId>com.sun.faces</groupId> 
            <artifactId>jsf-impl</artifactId> 
            <version>2.0.2</version> 
        </dependency>

在 web.xml 中添加上下文参数如下:-

<context-param>
    <param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
    <param-value>com.sun.facelets.FaceletViewHandler</param-value>
</context-param>
<context-param>
    <param-name>javax.faces.DISABLE_FACELET_JSF_VIEWHANDLER</param-name>
    <param-value>true</param-value>
</context-param>

用 2.5 版修改了我的应用程序描述符,例如:

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

我的 在 faces-config 中如下:-

 <application>
        <navigation-handler >
            org.navigation.CustomNavigationHandler
        </navigation-handler>

        <view-handler>
            org.ajax4jsf.application.AjaxViewHandler
        </view-handler>
<!--        <view-handler>
            com.sun.facelets.FaceletViewHandler
        </view-handler>-->
        <variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver>
        <message-bundle>MyMessages</message-bundle>
    </application>

应用程序部署成功,但之后在浏览器中启动应用程序时出现类转换异常错误:

服务器日志如下:

INFO: myApp was successfully deployed in 21,635 milliseconds.
SEVERE: Error Rendering View[/login.xhtml]
javax.faces.FacesException: java.lang.ClassCastException: java.lang.String cannot be cast to javax.faces.component.UIComponent
    at com.sun.faces.application.ApplicationImpl.createComponentApplyAnnotations(ApplicationImpl.java:1923)

它在 glassfish 2 中运行良好,所以我认为属性与支持 bean 的绑定没有问题。

我该如何解决这个问题??

【问题讨论】:

【参考方案1】:

java.lang.ClassCastException:java.lang.String 无法转换为 javax.faces.component.UIComponent 在 com.sun.faces.application.ApplicationImpl.createComponentApplyAnnotations

当你有一个String 值属性时会发生这种特殊的异常

private String value;

并使用binding 属性将其绑定到组件:

<h:inputText binding="#bean.value" />

这是不正确的。该值应使用value 属性绑定:

<h:inputText value="#bean.value" />

binding 仅用于将整个组件(它是UIComponent 的一个实例)绑定到支持 bean,例如以编程方式修改它。

验证您的login.xhtml 代码。如有必要,只要您仍然可以重现问题,就可以尽可能多地删除代码,以便最终得到尽可能小的代码 sn-p 准确重现此问题,这应该让您更容易找到罪魁祸首。

另见:

How does the 'binding' attribute work in JSF? When and how should it be used?

【讨论】:

嗨!感谢您的回复,我在表单中绑定了`
`,并且没有值属性我该怎么办??
RegistrationServiceBean.init 方法返回字符串 有你的原因。 删除它并在bean的构造函数中完成这项工作,或者使用&lt;f:event&gt;代替。

以上是关于javax.faces.FacesException: java.lang.ClassCastException: java.lang.String 不能转换为 javax.faces.compone的主要内容,如果未能解决你的问题,请参考以下文章