Google App Engine: f: setPropertyActionListener с p: ajax


Еще раз сочетание PrimeFaces и GAE сводит меня с ума. Внутри p:dataTable я хочу щелкнуть изображение, вызвать метод bean и задать параметр. Метод вызывается, но параметр не работает. Вот упрощенный пример (без таблицы):

<h:form id="f1">
  <h:outputText id="text" value="#{testBean.index}"/>
  <h:graphicImage url="/images/cut.png">
    <p:ajax event="click" process="@this" update="text"
            actionListener="#{testBean.test}" >
      <f:setPropertyActionListener target="#{testBean.index}" value="5" />
    </p:ajax>
  </h:graphicImage>
</h:form>

Мой TestBean выглядит так:

@javax.faces.bean.ManagedBean @ViewScoped
public class TestBean implements Serializable{
  private int index; // getter/setter

  @PostConstruct public void init() {
    index = 0;log.log(Level.WARNING, "@PostConstruct");}

  public void test(ActionEvent ae){
    log.log(Level.WARNING, "Index: "+index);}
}

В логах я вижу один @PostConstruct и после нажатия на изображение всегда Index: 0

Update проблема обновления значения может быть рассмотрена здесь JSF GAE: обновление значения Задача в управляемом методе bean

1 2

1 ответ:

Я мало что знаю о Гэ, поэтому не могу предположить, что он каким-то образом не вмешивается в ваш код. Однако я не думаю, что <f:setPropertyActionListener> является подходящим тегом для тега <p:ajax>. Я не верю, что он принимает это.

Вот пример того, как я реализовал ajax-вызов свойства viewscoped bean, используя <p:commandLink> и HTML-тег <span>.
<p:commandLink actionListener="#{listUsers.toModify}" oncomplete="userEditDlg.show()"
    update="addEditForm:editGrid addEditGrid:passwordChange addEditGrid:passwordGrid">
    <f:param name="userId" value="#{user.userId}" />
    <span class="ui-icon icoCogEdit" style="padding-right: 1.5em;" />
</p:commandLink>
<p:commandLink actionListener="#{listUsers.toDelete}" oncomplete="userDelDlg.show()"
    update="listUsersForm:dialogText">
    <f:param name="userId" value="#{user.userId}"/>
    <span class="ui-icon icoDelete" />
</p:commandLink>

Я просто установил класс CSS в качестве статического значка изображения по моему выбору, а затем, нажав на него, вызвал бы диалог.