2017-04-18 4 views
0

Nous avons dans notre projet JSF 2.2, un composant composite utilisé comme celui-ci (le code a été simplifié pour plus de clarté):f: auditeur ajax dans le composant composite a cessé de travailler dans wildfly 10

<!-- the page with the composite component inside --> 
<my:component methodListener="#{myBean.myMethod}" /> 

<!-- the composite component --> 
<cc:interface> 
    <cc:attribute name="methodListener" required="true" method-signature="void listener(javax.faces.event.AjaxBehaviorEvent)" /> 
    ... 
<cc:implementation> 
    <h:commandLink> 
     <f:ajax listener="#{cc.attrs.methodListener}" /> 
     <f:attribute name="myAttribute" value="myValue" /> 
    </h:commandLink> 
// the called method 
public void myMethod(AjaxBehaviorEvent event) 
{ 
    System.out.println("> " + event); 
} 

En wildfly 9.0.2, en cliquant sur le commandLink à l'intérieur du composant composite, myMethod est appelée et l'événement est défini (nous permettant de retrouver la valeur myAttribute).

Dans Wildfly 10.1.0, avec exactement le même code, myMethod est appelée mais le paramètre d'événement est toujours null.

Faisons-nous quelque chose de mal ici?

Une solution de contournement testée pourrait être de remplacer l'attribut methodListener CC par une instance de bean, quelque chose comme le code suivant. Cependant, cela nécessiterait beaucoup de remplacements dans notre projet, donc nous aimerions éviter cette solution.

<!-- the workaround composite component --> 
<cc:interface> 
    <cc:attribute name="methodBean" required="true" type="com.example.myBean" /> 
... 
<cc:implementation> 
    <h:commandLink> 
     <f:ajax listener="#{cc.attrs.methodBean.myMethod}" /> 
     <f:attribute name="myAttribute" value="myValue" /> 
    </h:commandLink> 

Répondre

0

Eh bien, je ne vois pas this answer de BalusC sur une autre question connexe. Je ne comprends toujours pas pourquoi mon code a travaillé sur WF9 et a brisé le WF10, mais voici une solution simple, où nous ne devons pas changer quoi que ce soit, mais le composant lui-même:

<!-- the CC xhtml --> 
<h:commandLink> 
    <f:ajax listener="#{cc.methodListener}" /> 
    <f:attribute name="myAttribute" value="myValue" /> 
</h:commandLink> 
// the CC implementation 
public void methodListener(AjaxBehaviorEvent event) 
{ 
    FacesContext context = getCurrentInstance(); 
    MethodExpression ajaxEventListener = (MethodExpression) getAttributes().get("methodListener"); 
    ajaxEventListener.invoke(context.getELContext(), new Object[] { event }); 
}