1 Reply Latest reply on Jun 14, 2012 12:51 PM by a.zhemoytuk

    Data Iteration components evaluate value on postback even if not rendered

    a.zhemoytuk

      Value of dataTable gets evaluated on postback even when not rendered.

       

      Reproduced on RichFaces 4.2.2.Final with following example:

       

        <h:form>
          <a4j:outputPanel rendered="false">
      
            <rich:dataTable value="#{bean.shouldNotBeInvoked}">
            </rich:dataTable>
      
          </a4j:outputPanel>
      
          <a4j:commandButton value="Generate Postback" execute="@this"/>
        </h:form>
      

       

       

      Stacktrace:

       

      2012-06-12 19:41:14,064 SEVERE [javax.enterprise.resource.webcontainer.jsf.application] (http--0.0.0.0-8543-39) Error Rendering View[/test.xhtml]: javax.el.ELException: /test.xhtml @14,69 value="#{bean.shouldNotBeInvoked()}":
          at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
          at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194) [jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]
          at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182) [jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]
          at org.richfaces.component.UISequence.getValue(UISequence.java:175) [richfaces-components-ui-4.2.2.Final.jar:4.2.2.Final]
          at org.richfaces.component.UISequence.createExtendedDataModel(UISequence.java:109) [richfaces-components-ui-4.2.2.Final.jar:4.2.2.Final]
          at org.richfaces.component.UIDataTableBase.createExtendedDataModel(UIDataTableBase.java:231) [richfaces-components-ui-4.2.2.Final.jar:4.2.2.Final]
          at org.richfaces.component.UIDataAdaptor.getExtendedDataModel(UIDataAdaptor.java:459) [richfaces-components-ui-4.2.2.Final.jar:4.2.2.Final]
          at org.richfaces.component.UIDataAdaptor.setRowKey(UIDataAdaptor.java:272) [richfaces-components-ui-4.2.2.Final.jar:4.2.2.Final]
          at org.richfaces.component.UIDataAdaptor.visitTree(UIDataAdaptor.java:1299) [richfaces-components-ui-4.2.2.Final.jar:4.2.2.Final]
          at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601) [jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]
          at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601) [jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]
          at javax.faces.component.UIForm.visitTree(UIForm.java:344) [jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]
          at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601) [jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]
          at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601) [jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]
          at org.richfaces.context.ExtendedPartialViewContextImpl.visitActivatorComponent(ExtendedPartialViewContextImpl.java:440) [richfaces-core-impl-4.2.2.Final.jar:4.2.2.Final]
          at org.richfaces.context.ExtendedPartialViewContextImpl.visitActivatorAtRender(ExtendedPartialViewContextImpl.java:326) [richfaces-core-impl-4.2.2.Final.jar:4.2.2.Final]
          at org.richfaces.context.ExtendedPartialViewContextImpl.processPartialRenderPhase(ExtendedPartialViewContextImpl.java:245) [richfaces-core-impl-4.2.2.Final.jar:4.2.2.Final]
          at org.richfaces.context.ExtendedPartialViewContextImpl.processPartial(ExtendedPartialViewContextImpl.java:194) [richfaces-core-impl-4.2.2.Final.jar:4.2.2.Final]
          at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:981) [jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]
          at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1757) [jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]
          at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:391) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
          at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
          at org.jboss.seam.jsf.SeamViewHandler.renderView(SeamViewHandler.java:88) [jboss-seam.jar:2.3.0.Beta1]
          at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288) [jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]
          at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
          at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
          at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
          at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) [jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]
      

       

       

      UPDATE:

       

      Impact is wider, not just rich:dataTable but all components which extend UIDataAdaptor. Namely:

      rich:extendedDataTable

      rich:dataTable

      rich:dataGrid

      rich:collapsibleSubTable

      rich:list

      rich:tree

      a4j:repeat

        • 1. Re: Data Iteration components evaluate value on postback even if not rendered
          a.zhemoytuk

          similar jira issue:

          https://issues.jboss.org/browse/RF-11382

           

          Problem appears to be in org.richfaces.component.UIDataAdaptor class.

          Without patching RF sources the following workaround is possible (workaround should be repeated on every component extending UIDataAdaptor):

          public class UIDataTableWorkaround extends UIDataTable {

            @Override

            public void setRowKey(FacesContext facesContext, Object rowKey) {

              if (rowKey == null && getRowKey() == null) {

                return;

              }

              super.setRowKey(facesContext, rowKey);

            }

          }

           

          and in faces-config:

            <component>

              <component-type>org.richfaces.DataTable</component-type>

              <component-class>com.example.UIDataTableWorkaround</component-class>

            </component>