tutorial sesiones etiquetas español ejemplo concepto bean anotaciones jsf facelets myfaces

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?