3 Replies Latest reply on Jan 27, 2014 11:57 PM by Brian Leathem

    Request Scoped Producer and ajax partial rendering does not work as expected

    Frank Ruenagel Newbie

      An ajax commandlink or commandbutton calls a bean method to add an entry to a list, which is shown in the html. Then it renderes the list's id.  The list is produced by a @requestScoped producer method.

       

      If commandlink and list both are in the same form, the producer is called before the adder: the list on screen is not updated with the just added value.

       

      If (1) the commandlink is in a different form or

         (2) the commandlink is decorated with execute="@this", then it works as expected: the adder-method is called before the producer is called.

       

      This behaviour is at least inconsistent and unexpected.

       

      Tested with

       

      Tomcat 7, org.jboss.weld.servlet 2.0.4/2.1, Richfaces 4.3.4

      JBoss AS 7.1.1.Final with Richfaces 4.2.3

       

      Is this a bug or have I missed something?

       

      Here is the  xhtml, remove execute="@this" to reproduce  it:

       

      <h:form id="myform0">
        <a4j:commandButton execute="@this" render="tableidx"
        action="#{test.addToListOfStrings2('p')}" value=" Add a Line" />
      
      
        <br />
        <br />
        <a4j:commandLink  execute="@this"  render="tableidx"
        action="#{test.addToListOfStrings2('l')}">
                              Add a Line
                                  </a4j:commandLink>
        <br />
        <br />
      
      
        <h:panelGroup id="tableidx">
        <rich:dataTable var="_item"
        value="#{MYLISTOFSTRINGSX}" id="tableidxinner">
        <rich:column>
        <h:outputText value="#{_item}"></h:outputText>
        </rich:column>
      
      
        </rich:dataTable>
        </h:panelGroup>
      
      
        </h:form>
      
      
      
      
      
      
      
      
      
      
      

       

       

      Java:

      import java.io.Serializable;
      import java.util.ArrayList;
      import java.util.Date;
      import java.util.List;
      
      
      import javax.enterprise.context.Dependent;
      import javax.enterprise.context.RequestScoped;
      import javax.enterprise.context.SessionScoped;
      import javax.enterprise.inject.Produces;
      import javax.inject.Named;
      
      
      import org.apache.log4j.Logger;
      
      
      
      
      @Named
      @SessionScoped
      public class Test implements Serializable {
      
      
        private static final long serialVersionUID = 1L;
      
      
        private static final Logger log = Logger.getLogger(Test.class);
        private List<String> listOFStrings = new ArrayList<>();
      
      
        @Produces
        @Named("MYLISTOFSTRINGSX")
        @RequestScoped
        public List<String> fetchMyListOfStrings()
        {
        log.info("Fetch!");
      
        return new ArrayList<>(listOFStrings); // return new object to simulate database fetches
        }
      
      
      
        public void addToListOfStrings2(String v)
        {
        log.debug("Add TO List of Strings");
        listOFStrings.add(new Date().getTime() +"" +v);
        }
      
      }