2012-05-21 7 views
8

Ich habe einen einfachen Facelet tag:Facelet Tag-Parameter nicht durch PrimeFaces p erkannt: Ajax

<ui:composition> 
    <ui:insert /> 
</ui:composition> 

, die um mehr c:set Tags zu vermeiden, verwendet wird, erklärt.
Lassen Sie uns sagen, dass ich es in den facelets view, und verwenden Sie es wie folgt TagLib Bibliothek mit dem Namen registriert:

<my:view bean="#{myController}"> 
    <p:inputText value="#{bean.value}> 
    <p:ajax event="blur" process="@this" listener="#{bean.handleValueChanged}" /> 
    </p:inputText> 
</my:view> 

Das Attribut value ist perfekt gelöst durch p:inputText, aber p:ajax wirft dies:

Target Unreachable, identifier 'bean' resolved to null 
javax.el.PropertyNotFoundException: Target Unreachable, identifier 'bean' resolved to null 
    at com.sun.el.parser.AstValue.getTarget(AstValue.java:153) 
    at com.sun.el.parser.AstValue.invoke(AstValue.java:237) 
    at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:302) 
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:39) 
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50) 
    at org.primefaces.component.behavior.ajax.AjaxBehaviorListenerImpl.processAjaxBehavior(AjaxBehaviorListenerImpl.java:47) 

Ist es ein Fehler oder erwartetes Verhalten?

Update: Ich habe gerade das gleiche mit f: Ajax versucht und es hat funktioniert!

Btw, ist die Umgebung wie folgt:
Glassfish 3.1.2
PF 3.0, 3.2, 3.3

Update2:
This Problem mit RichFaces absolut identisch ist. Scheint wie ein PrimeFaces-Bug zu sein (ich werde heute ein Problem im PF-Bug-Tracker veröffentlichen).

+0

+1 für die Forschung wiederverwendet werden ... – Addicted

+1

Wie versprochen, öffnete ich das Problem auf PF Bug-Tracker: http://code.google .com/p/premafaces/issues/detail? id = 4075 – jFrenetic

Antwort

4

Mein Kollege hat gerade einen Patch zur Verfügung gestellt, um dieses Problem zu lösen.

Die aktuelle Implementierung von AjaxBehaviorListenerImpl#processAjaxBehaviour ist wie folgt:

public void processAjaxBehavior(AjaxBehaviorEvent event) throws AbortProcessingException { 
     FacesContext context = FacesContext.getCurrentInstance(); 
     final ELContext elContext = context.getELContext(); 

     try{ 
      listener.invoke(elContext, new Object[]{}); 
     } catch (MethodNotFoundException mnfe) { 
      MethodExpression argListener = context.getApplication().getExpressionFactory(). 
         createMethodExpression(elContext, listener.getExpressionString(), null, new Class[]{event.getClass()}); 

      argListener.invoke(elContext, new Object[]{event}); 
     } 
    } 

Er schlägt vor, es so zu zwicken:

import javax.faces.view.facelets.FaceletContext; 

public void processAjaxBehavior(AjaxBehaviorEvent event) throws AbortProcessingException { 
     FacesContext context = FacesContext.getCurrentInstance(); 
     final ELContext elContext = context.getELContext(); 

     try{ 
      listener.invoke(elContext, new Object[]{}); 
     } catch (MethodNotFoundException mnfe) { 
      FaceletContext fc = (FaceletContext) context.getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY); 
      MethodExpression argListener = context.getApplication().getExpressionFactory(). 
         createMethodExpression(fc, listener.getExpressionString(), null, new Class[]{ event.getClass() }); 

      argListener.invoke(elContext, new Object[]{ event }); 
     } 
    } 

Hoffentlich wird dies durch PF-Team genehmigt werden.

+0

Gute Arbeit! Dies kann theoretisch ein Problem lösen, das wir haben, wenn wir '' in einer Tag-Datei verwenden. – BalusC

+0

@BalusC Danke! Allerdings sollten alle meine Anerkennung an meinen Kollegen gehen (ich bezweifle, dass er einen SO-Account hat). Ich habe gerade das Problem bemerkt, und er hat es gelöst :) Gibt es einen offenen Fehler bezüglich ' jFrenetic

+0

Nein, es ist für meinen Job.Wir haben eine Tag-Datei, die eine '' zusammen mit einem '', so dass es als einzelnes Tag von '' in der Datentabelle eingeschlossen werden kann. Die ' 'hat jedoch nie die Listener-Methode aufgerufen. – BalusC

-1

Die Optimierung funktioniert nicht mit meinem Anwendungsfall, der komplexer ist als ein einziges UI: Include.

<c:forEach items="#{items}" var="item"> 
      <ui:include src="#{item.uri}"> 
       <ui:param name="itemBean" value="#{item.bean}"/> 
      </ui:include> 

</c:forEach> 

Ich denke, die Variable-Mapper des Zuhörers muss in der neuen method

+0

Erwähnen Sie es in Kommentaren oder bitte eine andere Frage. SO ist kein Forum. –

+0

Ich kann einfach nicht, nicht genug Ruf und eine neue Frage zu stellen ist keine Lösung. By the way, ich habe einen Patch zu diesem Problem http://code.google.com/p/primefaces/issues/detail?id=4075 (als Nichthril), die akzeptiert und angewendet –

+0

Entschuldigung für die Reputationsgrenze eingereicht. Dieses Problem besteht immer noch in der aktuellen Version 3.5 Sind Ihre Probleme nach diesem Update verschwunden? –