jsf - sesiones - Pasando nombres de métodos de acción como argumentos a facetas de componentes
managed bean concepto (2)
Pasar un método como parámetro se debe hacer de esta manera:
itemBean="#{bean}"
itemEditAction="productEditAction"
y en tu componente los pondrás juntos:
action="#{itemBean[itemEditAction]}"
Estoy llamando a una plantilla y estoy pasando parámetros como a continuación:
<ui:include src="WEB-INF/Subviews/ProductEdit.xhtml">
<ui:param name="items" value="#{produtList}"></ui:param>
<ui:param name="itemToEdit" value="#{productToEdit}"></ui:param>
</ui:include>
y en el ProductEdit.xhtml, tengo algo como
<ui:repeat value="#{items}" var="item">
<tr>
...
...
<td style="text-align: center">
<h:commandLink style="cssGenericColumn" action="#{productEditAction}">
<f:setPropertyActionListener target="#{itemToEdit}" value="#{item}"/>
</h:commandLink>
</td>
<tr>
</ui:repeat>
que funciona bien.
Ahora quiero parametrizar el # {productEditAction} en el ProductEdit.xhtml y así hice lo siguiente
<ui:include src="WEB-INF/Subviews/ProductEdit.xhtml">
<ui:param name="items" value="#{produtList}"></ui:param>
<ui:param name="itemToEdit" value="#{productToEdit}"></ui:param>
<ui:param name="itemEditAction" value="#{productEditAction}"></ui:param>
</ui:include>
en la primera página y luego en ProductEdit.xhtml hago
<ui:repeat value="#{items}" var="item">
<tr>
...
...
<td style="text-align: center">
<h:commandLink style="cssGenericColumn" action="#{itemEditAction}">
<f:setPropertyActionListener target="#{itemToEdit}" value="#{item}"/>
</h:commandLink>
</td>
<tr>
</ui:repeat>
y esto falla en el siguiente error
javax.faces.el.EvaluationException: /WEB-INF/Subviews/ProductEdit.xhtml @45,89 action="#{itemEditAction}": Identity ''itemEditAction'' does not reference a MethodExpression instance, returned type: java.lang.String
at com.sun.facelets.el.LegacyMethodBinding.invoke(LegacyMethodBinding.java: at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java: at javax.faces.component.UICommand.broadcast(UICommand.java:109)....
....
....
....
Sin embargo, esto funciona si la acción está vinculada al objeto modelo. Así que algo como
<h:commandLink style="cssGenericColumn" action="#{item.editAction}">
¿Algunas ideas?
Tal vez el ActionMapperTagHandler podría funcionar.