java.lang.IollegalArgumentException:组件javax.faces.Component.



在我的JSF应用程序中,我使用的是数据表&tomhawk实现中的数据列表,但有时我会遇到以下异常。只有当我只使用Chrome浏览器时才会发生这种情况。

java.lang.IllegalArgumentException: Component javax.faces.component.html.HtmlDataTable is no org.apache.myfaces.custom.datalist.HtmlDataList
    org.apache.myfaces.custom.datalist.HtmlDataListTag.setProperties(HtmlDataListTag.java:117)
    javax.faces.webapp.UIComponentTag.createComponent(UIComponentTag.java:209)
    javax.faces.webapp.UIComponentClassicTagBase.createChild(UIComponentClassicTagBase.java:476)
    javax.faces.webapp.UIComponentClassicTagBase.findComponent(UIComponentClassicTagBase.java:660)
    javax.faces.webapp.UIComponentClassicTagBase.doStartTag(UIComponentClassicTagBase.java:1126)
    org.apache.jsp.HomeV_jsp._jspx_meth_t_005fdataList_005f0(HomeV_jsp.java:3903)
    org.apache.jsp.HomeV_jsp._jspx_meth_h_005fform_005f1(HomeV_jsp.java:3861)
    org.apache.jsp.HomeV_jsp._jspx_meth_f_005fview_005f0(HomeV_jsp.java:450)
    org.apache.jsp.HomeV_jsp._jspService(HomeV_jsp.java:155)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:408)
    com.sun.faces.application.ViewHandlerImpl.executePageToBuildView(ViewHandlerImpl.java:442)
    com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:115)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
    org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:696)
    org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:667)
    org.apache.jsp.index_jsp._jspService(index_jsp.java:67)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    com.advernture.discountbox.security.PageFilter.doFilter(PageFilter.java:43)

有人知道这里可能发生什么吗?导致这种情况的代码如下:

                                        <h:form id="browse_by_categry_frm">
                                        <div id="tagcloud">
                                            <t:dataList id="offer_cloud_table" value="#{CityCatagoryB.ctgryLstAsStr}" var="cat" binding="#{FindB.data}" layout="simple">
                                                <span style="padding-left:10px;padding-right:10px">
                                                    <h:commandLink value="#{cat}" action="#{FindB.doFind}" styleClass="subMenu"/>
                                                </span>                                                            
                                            </t:dataList>
                                        </div>
                                    </h:form>

binding="#{FindB.data}"应该引用一个属性,该属性仅由一个组件使用。此异常表示bean是会话范围的,并且您在Web应用程序的其他位置共享<h:dataTable>组件上的相同binding="#{FindB.data}"。它只出现在Chrome中,可能是因为它是唯一一个你在同一会话中使用<h:dataTable>打开另一个页面的浏览器。

请确保不要在多个组件之间共享binding背后的属性。否则,您的bean实际上必须在请求范围内。或者,寻找一种摆脱binding的方法,也许可以将value变成DataModel

看起来像是绑定问题。在你的FindB bean中,你有

private HtmlDataTable data;
//getters/setters

但你应该有:

private HtmlDataListdata;
//getters/setters

相反。因为t:dataList必须绑定到org.apache.myfaces.custom.dataList.HtmlDataList.类型的引用

当您将您的列表设置为以下时,请注意:

/**
 * Setter Related Report Link Roles.
 * 
 * @param relatedReportLinkRoles: Related Report Link Roles.
 */
public void setRelatedReportLinkRoles(List relatedReportLinkRoles) {
    this.relatedReportLinkRoles = relatedReportLinkRoles;
}

相反,您必须使用以下内容:

/**
 * Setter Related Report Link Roles.
 * 
 * @param relatedReportLinkRoles: Related Report Link Roles.
 */
public void setRelatedReportLinkRoles(List relatedReportLinkRoles) {
    this.relatedReportLinkRoles = relatedReportLinkRoles;
    if(roleRelatedReportDataTable != null) {
        roleRelatedReportDataTable.setValue(relatedReportLinkRoles);
    }
}

最新更新