0

奇妙な問題/バグに遭遇しましたが、どこにも有効な解決策が見つかりませんでした...

状況は次のとおりです。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 のスコープなど...)

とにかくアイデアが不足しているので、ここでこれを試してみようと思いました。誰にもアイデアがありますか?

4

2 に答える 2

0

immediate="true"に属性を追加してみてくださいcommandButton。これにより、検証よりもボタンが優先され、アクションが処理されます。

于 2014-10-22T15:30:22.483 に答える