奇妙な問題/バグに遭遇しましたが、どこにも有効な解決策が見つかりませんでした...
状況は次のとおりです。Spring Web Flow が、それぞれの横に「編集」ボタンがあるオブジェクトのリストを示す dataTable を含むビューステートを呼び出しています。
SWF は次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/webflow
http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd"
parent="parent-flow" start-state="home">
<persistence-context />
<var name="myObject" class="com.domain.MyObject" />
<view-state id="home">
<on-render>
<evaluate expression="myObjectService.findAll()"
result="viewScope.myObjectList" result-type="dataModel" />
</on-render>
<transition on="edit" to="editMO" />
<transition on="search" to="home" />
</view-state>
<subflow-state id="editMO" subflow="myObject/addEdit">
<input name="myObject" required="true" />
<transition to="end" />
</subflow-state>
<end-state id="end"
view="externalRedirect:servletRelative:/home" />
</flow>
いくつかの説明:
1) 「MyObject」クラスは、いくつかの属性と永続化のためのエンティティ アノテーションを持つ単純な pojo です。
2) 「myObjectService.findAll()」は、格納されているすべての「MyObject」のリストを返します。
ビューコードは次のとおりです (テンプレート standard.xhtml を使用):
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:c="http://java.sun.com/jsp/jstl/core"
template="/WEB-INF/layouts/standard.xhtml">
<ui:define name="title"></ui:define>
<ui:define name="content">
<h:form>
<div>
<p:dataTable id="tbl" value="#{myObjectList}" var="item">
<f:facet name="header">Result list</f:facet>
<p:column>
<f:facet name="header">Name</f:facet>#{item.name}
</p:column>
<p:column>
<f:facet name="header">Description</f:facet>#{item.description}
</p:column>
<p:column>
<f:facet name="header">Whatever</f:facet>#{item.whatever}
</p:column>
<p:column>
<f:facet name="header">Actions</f:facet>
<p:commandButton value="Edit" action="edit" icon="ui-icon-edit">
<f:setPropertyActionListener value="#{item}"
target="#{myObject}" />
</p:commandButton>
</p:column>
</p:dataTable>
</div>
</p:panel>
</h:form>
</ui:define>
</ui:composition>
「編集」ボタンの1つをクリックすると、ビューが再レンダリングされていることがトレースでわかりますが、アクション/イベント「編集」はトリガーされたり、検出されたり、キャッチされたりすることはありません(少なくとも私は知っています)。
面白いことに、(オブジェクト リストをロードするための) サービスへの呼び出しを Flow からビュー内の dataTable "value" 属性に移動すると、次のようになります。
<p:dataTable id="tbl" value="#{myObjectService.findAll()}"
すべてが完全に正常に動作します! しかし、その後、すべてのレンダリング イベント (最大 11 まで表示されます...) で多くの呼び出しに道を譲りますが、これは明らかに望ましくありません。
私の問題に近い主題に関する多くの投稿を見ましたが、誰もそれを解決できませんでした (フローリダイレクト属性「redirect-in-same-state」を false に変更し、遅延を強制的にオフに変更し、コンポーネントと変数のスコープを変更し、強制的にサービスまたはバッキング Bean のスコープなど...)
とにかくアイデアが不足しているので、ここでこれを試してみようと思いました。誰にもアイデアがありますか?