java.lang.IllegalArgumentException: компонент javax.faces.component.html.HtmlDataTable не является org.apache.myfaces.custom.datalist.HtmlDataList - PullRequest
1 голос
/ 25 января 2012

В моем приложении 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>

Ответы [ 3 ]

2 голосов
/ 25 января 2012

binding="#{FindB.data}" должно относиться к свойству, которое используется только одним компонентом. Это исключение указывает на то, что bean-компонент имеет сессионную область и вы совместно используете тот же binding="#{FindB.data}" для компонента <h:dataTable> где-то еще в веб-приложении. Это происходит только в Chrome, возможно, потому, что это был единственный браузер, где вы открыли другую страницу с <h:dataTable> в том же сеансе заранее.

Убедитесь, что вы не разделяете свойство, стоящее за binding, между несколькими компонентами. В противном случае ваш бин действительно должен находиться в области запроса. Или найдите способ избавиться от binding, возможно, сделав value a DataModel.

0 голосов
/ 24 декабря 2013

любезно, когда вы задаете свой список следующим образом:

/**
 * 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);
    }
}
0 голосов
/ 25 января 2012

Похоже, проблема связывания. В вашем бине FindB у вас есть

private HtmlDataTable data;
//getters/setters

Но вы должны иметь:

private HtmlDataListdata;
//getters/setters

вместо этого. Потому что t: dataList должен быть связан со ссылкой типа org.apache.myfaces.custom.datalist.HtmlDataList.

...