2016-11-21 4 views
0

Ich habe eine verwaltete Bean, die ViewScoped ist. In dieser Bean muss ich ein Formular senden (mit h: commandButton). Das funktioniert gut, außer wenn ich meinen Dropdown-Menüeintrag ändere (der ein Ereignis auslöst und die Seite aktualisiert). Nachdem Sie den Wert des Dropdown-Menüs geändert haben, wird beim Übergeben des Formulars die Bean neu erstellt (und die mit h: commandButton verknüpfte Aktion übersprungen).ViewScoped Bean neu erstellt, anstatt Formularaktion aufzurufen

Hier ist meine XML:

<rich:panel styleClass="panel_grid_center fifty_percent" 
     header="Bid matrix"> 

     <!-- display in case the user is not an admin --> 
     <h:panelGroup rendered="#{not loginBean.isAdmin}"> 

      <h:outputText 
       value="You do not have sufficient permission to view this page." /> 
      <br /> 
      <h:form> 
       <h:commandLink action="index.xhtml" 
        value="Click here to go back to login page/search page." /> 
      </h:form> 
     </h:panelGroup> 

     <!-- display if the user is an admin --> 
     <h:panelGroup rendered="#{loginBean.isAdmin}" id="bid_matrices_panel"> 
       <h:panelGrid columns="2"> 

        <!-- customer group panel --> 
        <rich:panel styleClass="contained_width fifty_percent" 
         header="Customer group"> 
         <h:form> 
          <h:selectOneMenu 
           valueChangeListener="#{adminBean.onCustomerGroupChangeListener}" 
           value="#{adminBean.customerGroupService.displayCustomerGroup.spendMinimum}"> 
           <f:selectItems 
            value="#{adminBean.customerGroupService.customerGroups}" 
            var="group" itemLabel="#{group.customerGroupLabel}" 
            itemValue="#{group.spendMinimum}" /> 
           <a4j:ajax event="valueChange" execute="@this" 
            render="bid_matrices_panel" /> 
          </h:selectOneMenu> 
         </h:form> 
        </rich:panel> 

        <!-- repeatables --> 
        <rich:panel styleClass="contained_width fifty_percent" 
         header="Repeatables"> 
        </rich:panel> 
       </h:panelGrid> 

       <h:form> 
        <!-- we loop on each different commoditization (or however that's spelled) --> 
        <a4j:repeat var="bidmatrix_by_commoditization" 
         value="#{adminBean.bidMatrices}"> 
         <rich:dataTable styleClass="contained_width" 
          value="#{bidmatrix_by_commoditization.bidMatricesByCoreStatus}" 
          var="matrix_by_core_status"> 


          <!-- Display core status --> 
          <rich:column> 
           <f:facet name="header"> 
            <h:outputText 
             value="#{bidmatrix_by_commoditization.commoditization}" /> 
           </f:facet> 
           <h:outputText value="#{matrix_by_core_status.coreStatus}" /> 
          </rich:column> 

          <!-- the percentages --> 
          <c:forEach var="index" begin="0" 
           end="#{adminBean.columnsNumber - 1}"> 
           <rich:column> 
            <f:facet name="header"> 
             <h:outputText value="#{adminBean.columnsHeaders[index]}" /> 
            </f:facet> 
            <h:inputText 
             value="#{matrix_by_core_status.bidMatrices[index].percentage}"> 
             <f:convertNumber type="percent" /> 
            </h:inputText> 
           </rich:column> 
          </c:forEach> 
         </rich:dataTable> 
        </a4j:repeat> 

        <br /> 

        <!-- update matrix button --> 
        <h:commandButton value="Update" action="#{adminBean.update}" /> 
       </h:form> 
     </h:panelGroup> 
    </rich:panel> 

Meine Bohne:

@ManagedBean(name = "adminBean") 
@ViewScoped 
public class AdminBean implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 5917562235108703019L; 

    private CustomerGroupService customerGroupService; 
    private BidMatrixDao bidMatrixDao; 
    private List<BidMatricesByCommoditization> bidMatrices; 

    @PostConstruct 
    public void init() { 
     customerGroupService = new CustomerGroupService(); 
     bidMatrixDao = new BidMatrixDaoImpl(); 
     bidMatrices = bidMatrixDao.getBidMatricesByCustomerGroup(customerGroupService.getDisplayCustomerGroup()); 
    } 

    public void onCustomerGroupChangeListener(ValueChangeEvent v) { 
     customerGroupService.setDisplayCustomerGroup((BigDecimal) v.getNewValue()); 
     bidMatrices = bidMatrixDao.getBidMatricesByCustomerGroup(customerGroupService.getDisplayCustomerGroup()); 
    } 

    public CustomerGroupService getCustomerGroupService() { 
     return customerGroupService; 
    } 

    /** 
    * @param customerGroupService 
    *   the customerGroupService to set 
    */ 
    public void setCustomerGroupService(CustomerGroupService customerGroupService) { 
     this.customerGroupService = customerGroupService; 
    } 

    /** 
    * @return the bidMatrices 
    */ 
    public List<BidMatricesByCommoditization> getBidMatrices() { 
     return bidMatrices; 
    } 

    /** 
    * @param bidMatrices 
    *   the bidMatrices to set 
    */ 
    public void setBidMatrices(List<BidMatricesByCommoditization> bidMatrices) { 
     this.bidMatrices = bidMatrices; 
    } 

    public int getColumnsNumber() { 
     return bidMatrices.get(0).getColumns(); 
    } 

    public List<String> getColumnsHeaders() { 
     return bidMatrixDao.getAlignments(); 
    } 

    public void update() { 
     bidMatrixDao.updateBidMatrices(bidMatrices); 
    } 
} 

Bitte beachte, dass ich richtig ViewScoped von javax.faces.bean.ViewScoped; importieren Ich entfernte auch die Getter/Setter aus meiner Bohne aber sie sind da. Wie gesagt, das Formular funktioniert gut, wenn es ohne Änderung des h: selectOneMenu-Werts übergeben wird.

Vielen Dank!

Edit: Ich verwende JSF 2.2 (mojarra), Richfaces 4.1, mit Wildfly 10.1

+0

JSF impl und Version? Richface-Version? – Kukeltje

+0

JSF 2.2 ist eine API-Spezifikation, keine JSF-Implementierung und -Version. Wildfliege 10.1 verwendet? – Kukeltje

Antwort

0

fixiert ich dies durch die ID in meiner Ajax-Richtlinie verwendet bewegend:

<a4j:ajax event="valueChange" execute="@this" render="bid_matrices_panel" /> 

ich ursprünglich setzen ID in der Mutter panelGroup, wie folgt aus:

<h:panelGroup rendered="#{loginBean.isAdmin}" id="bid_matrices_panel"> 

Durch eine reiche erstellen: Panel um den Teil möchte ich eigentlich rerender ist mein Problem behoben:

<h:form> 
    <rich:panel id="bid_matrices_panel"> 
     <! -- my data to render --> 

    </rich:panel> 

    <h:commandButton value="Update" action="#{adminBean.update}" /> 
</h:form> 

Ich denke, das Rendern des Formulars war die Ursache des Problems.

Ziemlich sicher, dass ich versuchte, dass vor, aber damals hatte ich auch implements Serializable auf meinem AdminBean vergessen ...

Verwandte Themen