2012-05-21 17 views
8

Ho un semplice tag facelet:facelet parametro tag non riconosciuto da primefaces p: ajax

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

che viene utilizzato al fine di evitare dichiarando multipla c:set tag.
Diciamo che ho registrato nelle facelets taglib libreria con il nome view, e usarlo in questo modo:

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

L'attributo value è perfettamente risolto p:inputText, ma p:ajax tiri questo:

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) 

È un bug o un comportamento previsto?

Aggiornamento: Ho appena provato lo stesso con f: ajax e ha funzionato!

Btw, l'ambiente è la seguente:
Glassfish 3.1.2
PF 3.0, 3.2, 3.3

Update2:
This problema con RichFaces è assolutamente identico. Sembra essere un bug PrimeFaces (pubblicherò un problema su bug tracker PF oggi).

+0

+1 per la ricerca ... – Addicted

+1

Come promesso, ho aperto la questione sul PF bug tracker: http://code.google .com/p/primefaces/issues/detail? id = 4075 – jFrenetic

risposta

4

Il mio collega ha appena fornito una patch per risolvere questo problema.

L'implementazione corrente di AjaxBehaviorListenerImpl#processAjaxBehaviour è la seguente:

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}); 
     } 
    } 

Egli propone di modificare in questo modo:

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 }); 
     } 
    } 

Speriamo che questo sarà approvato dal team di PF.

+0

Bel lavoro! Questo può teoricamente risolvere un problema che abbiamo quando si usa '' in un file di tag. – BalusC

+0

@BalusC Grazie! Però, tutti i miei complimenti dovrebbero andare dal mio collega (dubito che abbia un account SO). Ho appena notato il problema, e l'ha risolto :) C'è un bug aperto riguardante ' jFrenetic

+0

No, è per il mio lavoro.Abbiamo un file di tag che contiene un '' insieme a un' ' in modo che possa essere incluso come un singolo tag da '' nella tabella dati, tuttavia '' non ha mai richiamato il metodo listener. – BalusC

-1

Il tweak non funziona con il mio caso d'uso che è più complesso di un singolo ui: include.

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

</c:forEach> 

Penso mapper variabile di chi ascolta deve essere riutilizzato all'interno del nuovo MethodExpression

+0

menzionalo nei commenti o fai un'altra domanda per favore. SO non è un forum. –

+0

Non posso, non abbastanza reputazione e fare una nuova domanda non è una soluzione. A proposito, ho inviato una patch a questo numero http://code.google.com/p/primefaces/issues/detail?id=4075 (come nithril) che è stata accettata e applicata –

+0

scusa per il limite di reputazione. Questo problema esiste ancora nella versione 3.5, i tuoi problemi scompaiono dopo questa correzione? –

Problemi correlati