在我的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);
}
}