2012-04-09 8 views
0

Probleme mit Java Web App bei der Verwendung von JSF + PrettyFaces für Navigations- und Bean-Aktionen.JSF2 <h: selectOneMenu und <f: ajax listeners werden nicht nach PrettyFaces Filter Navigation aufgerufen

mit Versionen:

JSF - 2.1
PrettyFaces - 3.3.3

Fehler tritt auf, wenn die Navigation Handhabung PrettyFaces Filter von Link:

   <div class="product_img"> 
       <pretty:link mappingId="viewProduct"> 
        <img src="#{request.contextPath}/image?id=#{product.mainImage.fileReference.id}" />            
        <f:param value="#{productMB.filters.productCategoryName}" /> 
        <f:param value="#{product.name}" />                   
       </pretty:link>             
      </div>               

hübsch-config .xml mapping ist:

bean Aktion:

public String openProductDetails() { 

    if (filters.getProductCategoryName() != null && !filters.getProductName().equals("")) {   
     loadProductDetailsByName(filters.getProductCategoryName()); 
    } 

    return "/pages/productDetails.faces"; 
} 

Benutzer landet in Produktdetails Seite, wo er von Produkteigenschaften wie Farbe auswählen können, Größe, etc ...

<ui:fragment rendered="#{productMB.productVO.featureColorAvailable}"> 
     <span class="productFeatureLabel">#{msg.color}</span> 

     <h:selectOneMenu id="colorSelect" 
      value="#{productMB.productVO.colorSelected}" 
      valueChangeListener="#{productMB.colorSelectedValueChanged}"> 
      <f:selectItem itemLabel="#{msg['select']}" noSelectionOption="true" /> 
      <f:selectItems value="#{productMB.productFeatureAvailableApplMap['color']}" var="colorItem" itemValue="#{colorItem}" 
       itemLabel="#{msg[colorItem.name]}" /> 
      <f:ajax event="valueChange"    
      listener="#{productMB.colorSelectedValueChanged}" 
       render="@this productDetailImage productSubImage productSubImage2 productSubImage3 sizeSelect"></f:ajax> 
     </h:selectOneMenu>  
    </ui:fragment> 

// ... Bean Aktionsmethoden

public void colorSelectedValueChanged(ValueChangeEvent event) { 

     if (null != event.getNewValue()) { 
      ProductFeatureAppl prodFeatureAppl = (ProductFeatureAppl) event.getNewValue(); 
      filterProductFeatureSelectItem(AppConstants.SIZE, prodFeatureAppl.getProductFeature().getName()); 
     } else { 
      filterProductFeatureSelectItem(AppConstants.SIZE, null); 
     } 
    } 

    public void colorSelectedValueChanged(AjaxBehaviorEvent event) throws javax.faces.event.AbortProcessingException { 

     try { 
      if (null != productVO.getColorSelected()) { 
       ProductFeatureAppl prodFeatureAppl = productVO.getColorSelected(); 
       filterProductFeatureSelectItem(AppConstants.SIZE, prodFeatureAppl.getProductFeature().getName()); 

       String prodFeatName = prodFeatureAppl.getProductFeature().getName(); 

       // switch selected pics. 
       productVO.setCurrentDetailImageName(productVO.getProduct().getProductImageByTypeAndFeatureName(
         NameConstants.DETAIL, prodFeatName).getFileReference().getId()); 

       productVO.setCurrentBigImageName(productVO.getProduct().getProductImageByTypeAndFeatureName(
         NameConstants.BIG, prodFeatName).getFileReference().getId()); 

      } else { 
       filterProductFeatureSelectItem(AppConstants.SIZE, null); 
       filterProductFeatureSelectItem(AppConstants.COLOR, null); 

       // reset to default 
       productVO.setCurrentDetailImageName(productVO.getProduct().getProductImageByType(ProductImageType.DETAIL1.toString()).getFileReference().getId()); 
       productVO.setCurrentBigImageName(productVO.getProduct().getProductImageByType(ProductImageType.BIG1.toString()).getFileReference().getId());             
      }  

     } catch (Exception ex) { 
      addErrorMessage(getMessage("error")); 
      if (screenComponent.isDisplayException()) { 
       addErrorMessage(ex.getMessage()); 
      } 
     } 

    } 

Nach dem ersten Navigation zur Produktdetailseite, wenn ein Wert von selectOneMenu id = "Colorselect" die valueChangeListener und Ajax Zuhörer die Auswahl nicht genannt. Außerdem wird die Aktion productMB.openProductDetails aufgerufen.

Der Ajax-Aufruf wird ohne Fehler abgeschlossen, die ich in den Protokollen sehen kann, aber keine Listener-Methoden aufgerufen werden. Weiß jemand, warum diese JSF-Ajax-Listener übersprungen werden?

Vielen Dank im Voraus.

Antwort

1

Funktioniert die Seite, wenn Sie direkt über die URL darauf zugreifen? Funktioniert es, wenn PrettyFaces deaktiviert ist?

Ich bezweifle, dass dies ein Problem mit dem Link oder PrettyFaces ist. Ich wette, dass es mehr mit AJAX und Partial-State-Saving zu tun hat.

Es ist möglich, dass es damit zu tun hat:

public String openProductDetails() { 
    if (filters.getProductCategoryName() 
      != null && !filters.getProductName().equals("")) {   
     loadProductDetailsByName(filters.getProductCategoryName()); 
    } 

    return "/pages/productDetails.faces"; // why is this being returned? 
} 

Sie einen Seitennamen zurückkehren dort. PrettyFaces kann tatsächlich versuchen, auf diesem String zu navigieren. Wenn Sie die Seite anzeigen möchten, die Sie in Ihrem Mapping konfiguriert haben, geben Sie einfach null zurück, geben Sie eine leere Zeichenfolge zurück oder geben Sie nichts zurück.

Hoffe, das hilft.

+0

Ich habe die Methode geändert, um null zurückzugeben; Jetzt werden die Listener aufgerufen, aber productMB.openProductDetails() wird immer noch im JSF-Lebenszyklus für die HTTP POST Ajax-Anforderung aufgerufen. Ich habe versucht, zu ändern: \t \t Pretty Filter \t com.ocpsoft.pretty.PrettyFilter \t \t false \t \t \t zu wahr und falsch und keiner hat gelöst.Ich habe auch versucht, die Filterzuordnungen für PrettyFilter zu ändern, um Dispatcher für ASYNC und INCLUDE einzuschließen, aber das Hinzufügen oder das Entfernen löste das Problem nicht. – guilhebl

+0

Ich habe den Grund gefunden, warum productMB.openProductDetails nach einer Ajax-Anfrage aufgerufen wurde. Ich fügte # {productMB.openProductDetails} hinzu. Ich glaube, ich müsste onPostback = false für alle Seiten mit ajax-Komponenten einschließen. Weißt du, ob dies eine korrekte Aussage bezüglich Ajax Calls und PrettyFaces ist? Danke im Voraus. – guilhebl

+0

Ja, das ist korrekt, da JSF AJAX-Anfragen tatsächlich HTTP POST verwenden. – Lincoln