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>