Передача имен методов действия в качестве аргументов компонентам Facelets - PullRequest
17 голосов
/ 14 апреля 2011

Я вызываю шаблон и передаю параметры, как показано ниже:

<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>

, а в ProductEdit.xhtml у меня есть что-то вроде

<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>

, которое отлично работает.

Теперь я хочу параметризовать # {productEditAction} в ProductEdit.xhtml, и поэтому я сделал следующее

<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>

на первой странице, а затем в ProductEdit.xhtml я делаю

<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>

, и это приводит к ошибке при следующей ошибке

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)....
 ....
 ....
 ....

Однако это работает, если действие привязано к объекту модели.Так что-то вроде

 <h:commandLink style="cssGenericColumn" action="#{item.editAction}">

Есть идеи?

Ответы [ 2 ]

47 голосов
/ 14 апреля 2011

Передача метода в качестве параметра должна быть выполнена следующим образом:

itemBean="#{bean}"
itemEditAction="productEditAction"

и в ваш компонент вы поместите их вместе:

action="#{itemBean[itemEditAction]}"
2 голосов
/ 03 августа 2012

Может быть, ActionMapperTagHandler сработает.

...