Sorry to reply to myself, but I forgot to provide the relevant part of the component spec.
<component-specification class="com.workscape.comp.web.DirectReportsTab" allow-informal-parameters="no"> <!-- User controlled number of direct reports per page --> <property-specification name="directReportsPerPage" type="int"/> <property-specification name="tableModel" type="org.apache.tapestry.contrib.table.model.ITableModel" persistent="yes"/> <!-- Direct Reports Table --> <component id="directReportsTable" type="contrib:Table"> <binding name="tableModel" expression="tableModel"/> <binding name="rowsClass" expression="beans.evenOdd.next"/> </component> </component-specification> On 4/28/05, Tim Downey <[EMAIL PROTECTED]> wrote: > > Hi, > > I'm receiving an ApplicationRuntimeException whenever I attempt to > sort a Table component. The initial load of the Table component is > fine, but any attempts to sort cause the ApplicationRuntimeException > with this message: > > "Either the tableModel parameter or both source and columns parameters > must be specified by component > CompPlannerHome/directReports.directReportsTable.tableView" > > The offending Table component is embedded in a custom tab component > that I am building. So long as the Table was directly embedded in a > Page, I have not had a problem. I can't seem to sort out what the > difference is. > > I have attempted to step through the debugger to sort out what is > going on. Here's a synopsis of what I've seen. Hopefully someone can > shed some light. > > After clicking the column header to trigger the sort, I stepped > through the listener cycle. Throughout the listener cycle, the > TableModel is non-null and available. After the listener cycle, > during the render cycle on my custom tab component, it is null. In > fact, none of the bindings for my custom tab component have been set > yet. I'm not really sure why this is. > > As I mentioned, it works fine on the initial request. Requests to > change the sort seem to causes the problem. > > Also, the call to pageBeginRender on my custom tab component that > happens just prior to the renderComponent on the Table is able to > see/access the table model for the contained Table component. > > Here's a stack trace. I hope someone can help. I've been struggling > with this for two days.... > > > ---------------------------------------------------------------------------------------------------------------------------------- > Either the tableModel parameter or both source and columns parameters > must be specified by component > CompPlannerHome/directReports.directReportsTable.tableView > Stack Trace: > > org.apache.tapestry.contrib.table.components.TableView.getTableModel( > TableView.java:199) > org.apache.tapestry.contrib.table.components.TableView.validateValues( > TableView.java:439) > org.apache.tapestry.contrib.table.components.TableView.renderComponent( > TableView.java:471) > org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:857) > org.apache.tapestry.BaseComponent.renderComponent(BaseComponent.java:118) > org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:857) > org.apache.tapestry.BaseComponent.renderComponent(BaseComponent.java:118) > > com.workscape.comp.web.component.secure.component.ProtectedComponent.renderComponent > (ProtectedComponent.java:44) > org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:857) > org.apache.tapestry.components.Delegator.renderComponent(Delegator.java > :45) > org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:857) > org.apache.tapestry.BaseComponent.renderComponent(BaseComponent.java:118) > org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:857) > org.apache.tapestry.AbstractComponent.renderBody(AbstractComponent.java > :624) > org.apache.tapestry.components.RenderBody.renderComponent(RenderBody.java > :45) > org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:857) > org.apache.tapestry.AbstractComponent.renderBody(AbstractComponent.java > :624) > org.apache.tapestry.html.Body.renderComponent(Body.java:269) > org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:857) > org.apache.tapestry.AbstractComponent.renderBody(AbstractComponent.java > :624) > org.apache.tapestry.html.Shell.renderComponent(Shell.java:124) > org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:857) > org.apache.tapestry.BaseComponent.renderComponent(BaseComponent.java:118) > > com.workscape.comp.web.component.secure.component.ProtectedComponent.renderComponent > (ProtectedComponent.java:44) > org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:857) > org.apache.tapestry.BaseComponent.renderComponent(BaseComponent.java:118) > org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:857) > org.apache.tapestry.AbstractPage.renderPage(AbstractPage.java:300) > > com.workscape.comp.web.component.secure.component.page.ProtectedPage.renderPage > (ProtectedPage.java:71) > org.apache.tapestry.engine.RequestCycle.renderPage(RequestCycle.java:368) > org.apache.tapestry.engine.AbstractEngine.renderResponse( > AbstractEngine.java:732) > org.apache.tapestry.engine.DirectService.service(DirectService.java:174) > org.apache.tapestry.engine.AbstractEngine.service(AbstractEngine.java:872) > org.apache.tapestry.ApplicationServlet.doService(ApplicationServlet.java > :197) > com.workscape.comp.service.web.CPServlet.doService(CPServlet.java:65) > org.apache.tapestry.ApplicationServlet.doGet(ApplicationServlet.java:158) > javax.servlet.http.HttpServlet.service(HttpServlet.java:740) > javax.servlet.http.HttpServlet.service(HttpServlet.java:853) > weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run( > ServletStubImpl.java:971) > weblogic.servlet.internal.ServletStubImpl.invokeServlet( > ServletStubImpl.java:402) > weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:28) > weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java > :27) > com.workscape.directory.v1.interceptor.securty.AuthFilter$1.run( > AuthFilter.java:187) > java.security.AccessController.doPrivileged(Native Method) > javax.security.auth.Subject.doAs(Subject.java:379) > com.workscape.directory.v1.interceptor.securty.AuthFilter.doFilter( > AuthFilter.java:183) > sun.reflect.GeneratedMethodAccessor197.invoke(Unknown Source) > sun.reflect.DelegatingMethodAccessorImpl.invoke( > DelegatingMethodAccessorImpl.java:25) > java.lang.reflect.Method.invoke(Method.java:324) > com.workscape.directory.v1.interceptor.ServiceInterceptor.invoke( > ServiceInterceptor.java:131) > com.workscape.directory.v1.interceptor.stddb.STDDBInterceptor.invoke( > STDDBInterceptor.java:70) > > com.workscape.directory.v1.interceptor.session.HTTPSessionInterceptor.invoke > (HTTPSessionInterceptor.java:62) > > com.workscape.directory.v1.interceptor.hibernate3.SessionInterceptor.invoke > (SessionInterceptor.java:58) > > com.workscape.directory.v1.interceptor.tracer.ConnectionLeakDetectionTracer.invokeInternal > (ConnectionLeakDetectionTracer.java:113) > com.workscape.directory.v1.interceptor.tracer.BaseTracer.invoke( > BaseTracer.java:80) > com.workscape.directory.v1.interceptor.ServiceInterceptor.invoke( > ServiceInterceptor.java:104) > $Proxy20.doFilter(Unknown Source) > com.workscape.directory.v1.interceptor.http.HTTPInterceptor.doFilter( > HTTPInterceptor.java:79) > weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java > :27) > weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run > (WebAppServletContext.java:6356) > weblogic.security.acl.internal.AuthenticatedSubject.doAs( > AuthenticatedSubject.java:317) > weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118) > weblogic.servlet.internal.WebAppServletContext.invokeServlet( > WebAppServletContext.java:3635) > weblogic.servlet.internal.ServletRequestImpl.execute( > ServletRequestImpl.java:2585) > weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197) > weblogic.kernel.ExecuteThread.run(ExecuteThread.java:170) >
