6 Replies Latest reply on Aug 8, 2011 8:49 AM by srikannan_89

    a4j:support action is not called

    faupel

      Hi,

       

      I have a h:selectOneMenu that refreshes the content of a a4j:repeat. That works fine. When I add a4j:support to the h:selectOneRadio on the a4j:repeat, an ajax request is sent, but the action is not called. I have no validation on that page and the converters work well. I don't use ajax4jsf very long so it could be that I misunderstood something.Thank you in advance.

       

      Maximilian

       


      <s:decorate id="itemDecorate" template="/layout/display.xhtml">
          <ui:define name="label">
              Items
          </ui:define>
          <h:selectOneMenu     id="selectItem"
                              value="#{item}">
              <s:selectItems     id="items" 
                              var="item" 
                              noSelectionLabel=""
                              label="#{item.street}"
                              value="#{itemList.resultList}" />
              <s:convertEntity />
              <a4j:support event="onchange" reRender="blocksPanelGroup" />
          </h:selectOneMenu>
      </s:decorate>
      
      <h:panelGroup id="blocksPanelGroup">
          <a4j:repeat var="block" value="#{item.blocks}">
              <s:decorate id="blockCriterionDecorate" 
                          template="/layout/display.xhtml">
                  <ui:define name="label">
                      #{block.name}
                  </ui:define>
                  <h:selectOneRadio     id="blockCriterion"> 
                      <s:selectItems     var="criterion" 
                                      label="#{criterion.description}" 
                                      value="#{block.criterions}" />
                      <s:convertEntity />
                      <a4j:support     event="onchange"
                                      action="#{blockAction.save}" />
                  </h:selectOneRadio>
              </s:decorate>
          </a4j:repeat>
      </h:panelGroup>
      
        • 1. Re: a4j:support action is not called
          nbelaevski
          • 2. Re: a4j:support action is not called
            faupel

            Hi Nick,

             

            thank you for your answer, but I already know that. I read about 100 posts and tried everything. I have an output for faces messages in my template and I did override the equals and hashCode methods in my entities.

             

            That's what I put in my template:

            a4j:outputPanel ajaxRendered="true">

                <h:messages/>

            </a4j:outputPanel>

             

            I also put a <a4j:log /> tag on my page, but I can only see, that an ajax request is sent and I can't see any errors.

             

            Thanks

            Maxi

            • 3. Re: a4j:support action is not called
              nbelaevski

              OK, so we can exclude the most frequent coding issues. Can you please check this issue: https://issues.jboss.org/browse/RF-3314 to see if it's applicable to your case?

              • 4. Re: a4j:support action is not called
                faupel

                Two of my entities are in seams page scope. If I change that to conversation or session scope, the problem is still the same.

                • 5. Re: a4j:support action is not called
                  faupel

                  Hi Nick,

                   

                  I wrote a little example to reproduce the error. I hope you can see what I made wrong.

                   

                   

                  @Entity
                  @Scope(ScopeType.SESSION)
                  public class City implements Serializable {
                      /**
                       * 
                       */
                      private static final long serialVersionUID = -5262788797651793204L;
                      
                      private Long id;
                      private Integer version;
                      private String name;
                      private List<Street> streets = new ArrayList<Street>();
                  
                      @Id
                      @GeneratedValue
                      public Long getId() {
                          return id;
                      }
                      public void setId(Long id) {
                          this.id = id;
                      }
                  
                      @Version
                      public Integer getVersion() {
                          return version;
                      }
                      public void setVersion(Integer version) {
                          this.version = version;
                      }
                  
                      public String getName() {
                          return name;
                      }
                      public void setName(String name) {
                          this.name = name;
                      }
                  
                      @OneToMany(mappedBy = "city")
                      public List<Street> getStreets() {
                          return streets;
                      }
                      public void setStreets(List<Street> streets) {
                          this.streets = streets;
                      }
                      
                      @Override
                      public int hashCode() {
                          final int prime = 31;
                          int result = 1;
                          result = prime * result + ((id == null) ? 0 : id.hashCode());
                          result = prime * result + ((name == null) ? 0 : name.hashCode());
                          return result;
                      }
                      
                      @Override
                      public boolean equals(Object obj) {
                          if (this == obj) 
                              return true;
                          
                          if (!(obj instanceof City)) 
                              return false;
                          
                          City subject = (City) obj;
                          
                          return EqualsUtil.areEqual(this.id, subject.id) &&
                                 EqualsUtil.areEqual(this.name, subject.name);
                      }
                  }
                  

                   

                   

                  @Entity
                  @Scope(ScopeType.SESSION)
                  public class Street implements Serializable {
                      /**
                       * 
                       */
                      private static final long serialVersionUID = -7650360829992051220L;
                      
                      private Long id;
                      private Integer version;
                      private String name;
                      private City city;
                  
                      @Id
                      @GeneratedValue
                      public Long getId() {
                          return id;
                      }
                      public void setId(Long id) {
                          this.id = id;
                      }
                  
                      @Version
                      public Integer getVersion() {
                          return version;
                      }
                      public void setVersion(Integer version) {
                          this.version = version;
                      }
                  
                      public String getName() {
                          return name;
                      }
                      public void setName(String name) {
                          this.name = name;
                      }
                  
                      @ManyToOne
                      public City getCity() {
                          return city;
                      }
                      public void setCity(City city) {
                          this.city = city;
                      }
                      
                      @Override
                      public int hashCode() {
                          final int prime = 31;
                          int result = 1;
                          result = prime * result + ((id == null) ? 0 : id.hashCode());
                          result = prime * result + ((name == null) ? 0 : name.hashCode());
                          return result;
                      }
                      
                      @Override
                      public boolean equals(Object obj) {
                          if (this == obj) 
                              return true;
                          
                          if (!(obj instanceof Street)) 
                              return false;
                          
                          Street subject = (Street) obj;
                          
                          return EqualsUtil.areEqual(this.id, subject.id) &&
                                 EqualsUtil.areEqual(this.name, subject.name);
                      }
                  }
                  

                   

                   

                  public final class EqualsUtil {
                      public static boolean areEqual(boolean b1, boolean b2) {
                          return b1 == b2;
                      }
                  
                      public static boolean areEqual(char c1, char c2) {
                          return c1 == c2;
                      }
                  
                      public static boolean areEqual(long l1, long l2) {
                          return l1 == l2;
                      }
                  
                      public static boolean areEqual(float f1, float f2) {
                          return Float.floatToIntBits(f1) == Float.floatToIntBits(f2);
                      }
                  
                      public static boolean areEqual(double d1, double d2) {
                          return Double.doubleToLongBits(d1) == Double.doubleToLongBits(d2);
                      }
                      
                      public static boolean areEqual(Object o1, Object o2) {
                          return o1 == null ? o2 == null : o1.equals(o2);
                      }
                  }
                  

                   

                   

                  @Local
                  public interface CityLocal
                  {
                      public void initCityList();
                      public List<City> getCityList();
                      public void selectStreet(Street street);
                      public void destroy();
                  }
                  

                   

                   

                  @Stateful
                  @Name("cityAction")
                  @Scope(ScopeType.SESSION)
                  @Restrict("#{identity.loggedIn}")
                  public class CityAction implements CityLocal {
                  
                      @Logger
                      private Log log;
                      
                      @PersistenceContext
                      private EntityManager em;
                      
                      @DataModel
                      private List<City> cityList;
                      
                      @Factory("cityList")
                      @Begin(join = true)
                      @SuppressWarnings("unchecked")
                      public void initCityList() {
                          cityList = em.createQuery("from City c").getResultList();
                      }
                  
                      public List<City> getCityList() {
                          return cityList;
                      }
                  
                      public void selectStreet(Street street) {
                          log.info("selecting street {0}", street.getName());
                      }
                  
                      
                      @Destroy
                      @Remove
                      public void destroy() {
                      }
                  }
                  

                   

                   

                  <h:form id="cityForm">
                      <rich:panel>
                          <h:panelGrid columns="1">
                              <a4j:outputPanel ajaxRendered="true">
                                  <h:messages />
                              </a4j:outputPanel>
                              <a4j:log />
                              <s:decorate id="cityDecorate" template="/layout/display.xhtml">
                                  <ui:define name="label">
                                      Cities
                                  </ui:define>
                                  <h:selectOneMenu id="selectCity" value="#{city}">
                                      <s:selectItems id="cityItems" var="city" noSelectionLabel=""
                                          label="#{city.name}" value="#{cityList}" />
                                      <s:convertEntity />
                                      <a4j:support event="onchange" reRender="streetPanelGroup" />
                                  </h:selectOneMenu>
                              </s:decorate>
                  
                              <h:panelGroup id="streetPanelGroup">
                                  <a4j:repeat var="street" value="#{city.streets}">
                                      <h:panelGrid columns="2">
                                          <h:outputText value="#{street.name}" />
                                          <a4j:commandButton id="select" value="select"
                                              action="#{cityAction.selectStreet(street)}" />
                                      </h:panelGrid>
                                  </a4j:repeat>
                              </h:panelGroup>
                          </h:panelGrid>
                      </rich:panel>
                  </h:form>
                  
                  • 6. Re: a4j:support action is not called
                    srikannan_89

                    Hi Nick

                              i have problem in my code. Im using rich:modalPanel in my Code. inside that modal h:command Button is not working. it not hit the flow written in the flow.xml file.please refer some solution to me for this problem   

                     

                    Header 1

                    <?

                    xml version='1.0' encoding='UTF-8'

                    ?>

                    <!

                    DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

                     

                    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

                     

                      

                      

                    <

                    ui:composition xmlns=

                    "http://www.w3.org/1999/xhtml"

                     

                    xmlns:ui="http://java.sun.com/jsf/facelets"

                     

                    xmlns:h="http://java.sun.com/jsf/html"

                     

                    xmlns:f="http://java.sun.com/jsf/core"

                     

                    xmlns:a4j="http://richfaces.org/a4j"

                     

                    xmlns:rich="http://richfaces.org/rich">

                     

                      

                     

                    <f:subview>

                     

                    <h:form>

                     

                     

                    <h:panelGrid width="800px" columns="2" border="0">

                     

                    <rich:panel header="" style=" background-color:#E6E6DC;">

                     

                    <br></br>

                     

                    <br></br>

                     

                    <center><h:dataTable value="${flowScope.detail.skillList}"

                     

                    var="c" rowClasses="order-table-odd-row,order-table-even-row"

                     

                    width="500px" border="1">

                     

                     

                    <h:column style="width: 500px;">

                     

                     

                    <f:facet name="header">Skill Name</f:facet>

                     

                     

                    <h:outputText value="#{c.skillName}" />

                     

                     

                    </h:column>

                     

                     

                    <h:column style="width: 500px;">

                     

                    <f:facet name="header">Level</f:facet>

                     

                    <h:outputText value="#{c.level}" />

                     

                    </h:column>

                     

                     

                    <!-- <h:column >-->

                     

                    <!-- <f:facet name="header">Tick and Delete</f:facet>-->

                     

                    <!-- <h:selectBooleanCheckbox value="#{o.del}" >-->

                     

                    <!-- </h:selectBooleanCheckbox>-->

                     

                    <!-- </h:column>-->

                     

                     

                    </h:dataTable> <br></br>

                     

                    <br></br>

                     

                    <a href="#" onclick="#{rich:component('pop')}.show()">Add</a> <rich:spacer

                     

                    width="300px" /> <h:commandLink id="link" action="delSkill">

                     

                    <h:outputText value="Delete" />

                     

                    </h:commandLink> <br></br>

                     

                    <br></br>

                     

                    <h:commandButton value="Save" action="save2"

                     

                    styleClass="submitButton" /></center>

                     

                    </rich:panel>

                     

                    </h:panelGrid>

                     

                     

                    </h:form>

                     

                     

                    <rich:modalPanel id="pop" minHeight="200" minWidth="450"

                     

                    domElementAttachment="form">

                     

                    <f:facet name="header">

                     

                    <h:outputText value="Add Skill" />

                     

                    </f:facet>

                     

                    <f:facet name="controls">

                     

                    <h:outputLink value="#"

                     

                    onclick="#{rich:component('pop')}.hide(); return false;">

                    X Close

                     

                    </h:outputLink>

                     

                    </f:facet>

                     

                     

                    <a4j:form id="addSkill">

                     

                      

                     

                    <h:panelGrid id="lpg" columns="2">

                     

                    <h:outputText value="Skill Name" />

                     

                    <h:inputText id="skillname" value="${flowScope.skill.skillName}"

                     

                    styleClass="inputbox" required="true"

                     

                    requiredMessage="Enter Skillname" />

                     

                    <h:outputText value="" />

                     

                    <h:message for="skillname" styleClass="errors" />

                     

                      

                     

                    <h:outputText value="Level" />

                     

                    <h:inputText id="level" value="${flowScope.skill.level}"

                     

                    styleClass="inputbox" required="true"

                     

                    requiredMessage="Enter Level" />

                     

                    <h:outputText value="" />

                     

                    <h:message for="level" styleClass="errors" />

                     

                      

                     

                    <h:outputText value="" />

                     

                    <a4j:commandButton value="Add" action="panel1"

                     

                    styleClass="submitButton" />

                     

                    </h:panelGrid>

                     

                    </a4j:form>

                     

                     

                    </rich:modalPanel>

                     

                    </f:subview>

                     

                    </

                    ui:composition

                    >

                     

                    Header 1

                    <

                    flow xmlns=

                    "http://www.springframework.org/schema/webflow"

                     

                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

                     

                    xsi:schemaLocation="http://www.springframework.org/schema/webflow

                    http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd"

                     

                     

                     

                    <view-state id="loginPage" view="/WEB-INF/pages/loginPage.xhtml">

                     

                     

                    <on-entry>

                     

                    <evaluate expression="new com.bankofireland.internalportal.beans.Login()"

                     

                    result="flowScope.userlogin"></evaluate>

                     

                    </on-entry>

                     

                     

                    <transition on="submit" to="loginDecision">

                     

                    <evaluate expression="userService.validate(flowScope.userlogin)"

                     

                    result="flowScope.error" />

                     

                    </transition>

                     

                    </view-state>

                     

                     

                    <decision-state id="loginDecision">

                     

                    <if test="flowScope.error" then="welcome1" else="loginpage" />

                     

                    </decision-state>

                     

                      

                      

                     

                    <view-state id="welcome1" view="/WEB-INF/pages/welcome.xhtml">

                     

                    <on-entry>

                     

                    <evaluate expression="new com.bankofireland.internalportal.beans.Detail()"

                     

                    result="flowScope.detail" />

                     

                    <evaluate expression="new com.bankofireland.internalportal.beans.Skill()"

                     

                    result="flowScope.skill" />

                     

                     

                    </on-entry>

                     

                     

                    <transition on="autosave" to="savedecision">

                     

                    <evaluate expression="saveDetail.save(flowScope.detail)"

                     

                    result="flowScope.saveerror" />

                     

                    </transition>

                     

                    <!-- <transition on="add" >-->

                    <!-- <evaluate expression="saveDetail.test(flowScope.detail)"/></transition>-

                     

                     

                     

                    <transition on="panel1">
                       <evaluate expression="saveDetail.adduser(flowScope.skill,flowScope.detail)" />
                    
                    <evaluate expression="new com.bankofireland.internalportal.beans.Skill()" result="flowScope.skill" />
                    
                     
                       </transition>
                    

                     

                     

                     

                     

                    </view-state>

                     

                    <decision-state id="savedecision">

                     

                    <if test="flowScope.saveerror" then="thirdpage" else="welcome1" />

                     

                    </decision-state>

                     

                    <view-state id="thirdpage" view="/WEB-INF/pages/thirdpage.xhtml" />

                     

                    </

                    flow

                    >

                    >