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"
                              Add a Line
        <br />
        <br />
        <h:panelGroup id="tableidx">
        <rich:dataTable var="_item"
        value="#{MYLISTOFSTRINGSX}" id="tableidxinner">
        <h:outputText value="#{_item}"></h:outputText>




      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;
      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<>();
        public List<String> fetchMyListOfStrings()
        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);