What am I doing wrong - nested Set in a h:dataTable
henrik.lindberg Mar 30, 2007 9:48 PMThis is what I have in my view:
<h:outputText value="Count = #{cspecInfo.attributeCount}" /> <h:dataTable value="#{cspecInfo.componentAttributes}" var="attr" rows="25" > <h:column> <h:outputText value="#{attr.name}" /> </h:column> </h:dataTable>
The cspecInfo refers to an Entity that has a Set that is obtained as the value. (The output above refers to a transient attribute in the Entity bean (attributeCount).
I get the correct count as output. So I know I have things in the set.
When I try to render the #{attr.name} I get the following error:
ALLVARLIG: Error Rendering View[/cspec-view.xhtml] javax.faces.el.PropertyNotFoundException: /cspec-view.xhtml @113,43 value="#{attr.name}": Bean: org.hibernate.collection.PersistentSet, property: name at com.sun.facelets.el.LegacyValueBinding.getValue(LegacyValueBinding.java:58) at javax.faces.component.UIOutput.getValue(UIOutput.java:77) at org.apache.myfaces.shared_impl.renderkit.RendererUtils.getStringValue(RendererUtils.java:217) at org.apache.myfaces.shared_impl.renderkit.html.HtmlTextRendererBase.renderOutput(HtmlTextRendererBase.java:69) at org.apache.myfaces.shared_impl.renderkit.html.HtmlTextRendererBase.encodeEnd(HtmlTextRendererBase.java:57) at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:536) at org.apache.myfaces.shared_impl.renderkit.RendererUtils.renderChild(RendererUtils.java:442) at org.apache.myfaces.shared_impl.renderkit.RendererUtils.renderChildren(RendererUtils.java:419) at org.apache.myfaces.shared_impl.renderkit.RendererUtils.renderChild(RendererUtils.java:440) at org.apache.myfaces.shared_impl.renderkit.html.HtmlTableRendererBase.renderColumnBody(HtmlTableRendererBase.java:332) at org.apache.myfaces.shared_impl.renderkit.html.HtmlTableRendererBase.encodeColumnChild(HtmlTableRendererBase.java:301) at org.apache.myfaces.shared_impl.renderkit.html.HtmlTableRendererBase.encodeInnerHtml(HtmlTableRendererBase.java:277) at org.apache.myfaces.shared_impl.renderkit.html.HtmlTableRendererBase.encodeChildren(HtmlTableRendererBase.java:123) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:524) at com.sun.facelets.tag.jsf.ComponentSupport.encodeRecursive(ComponentSupport.java:244) at com.sun.facelets.tag.jsf.ComponentSupport.encodeRecursive(ComponentSupport.java:249) at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:573) at org.ajax4jsf.framework.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:101) at org.ajax4jsf.framework.ajax.AjaxViewHandler.renderView(AjaxViewHandler.java:222) at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:384) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:138) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:63) at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:57) at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:49) at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45) at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:49) at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:79) at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:49) at org.jboss.seam.web.SeamFilter.doFilter(SeamFilter.java:84) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.ajax4jsf.framework.ajax.xmlfilter.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:75) at org.ajax4jsf.framework.ajax.xmlfilter.BaseFilter.doFilter(BaseFilter.java:213) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:432) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) at org.jboss.web.tomcat.tc5.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112) at java.lang.Thread.run(Thread.java:619)
ComponentAttribute does have the attribute "name".
If I ouput something else - like static string - I get one row per object in the set (with the fixed string).
This is what the parent (what cspecInfo refers to) has as definition:
private Set<ComponentAttribute> m_componentAttributes; @OneToMany(mappedBy="spec") public Set<ComponentAttribute> getComponentAttributes() { return m_componentAttributes; } public void setComponentAttributes(Set<ComponentAttribute> attributes) { m_componentAttributes = attributes; } @Transient public String getAttributeCount() { if(m_componentAttributes == null) return "0"; return new Integer(m_componentAttributes.size()).toString(); }
And the corresponding part in the detail entity looks like this:
private ComponentSpec m_spec; @NotNull @Length(min = 1, max = 100) @Column(unique = true) public String getName() { return m_name; }
(it has an id column called 'cattr_id')
So - what am I doing wrong?
Should I access the data some other way?
Regards
- henrik