1

私はウェブフロー(SWF2)に取り組んでいます。エンティティは Roo を使用して生成されます。Webflow ビューの 1 つである multi-instance.jspx は、同じエンティティ (MyClass) の複数の永続化されたインスタンスを許可するために、複数回呼び出すことができます。

フローの後の時点でそれらを参照できるように、これらの永続化されたエンティティのリストを保持したいと思います。これまでのところ、次のことを試しました。

私の単純化されたバージョンはflow.xml次のようになります。

<on-start>
    <evaluate expression="new java.util.ArrayList()" result="flowScope.myList" result-type="java.io.Serializable"/>
</on-start>

<view-state id="multi-instance" view="multi-instance" model="myClass">
    <binder>
        <binding property="field1"/>
        <binding property="field2"/>
    </binder>
    <on-entry>
        <evaluate expression="new com.test.MyClass()" result="flowScope.myClass" />
    </on-entry>
    <transition on="another_instance" to="multi-instance"/>
    <transition on="success" to="confirm"/>
    <transition on="cancel" to="abort"/>
    <on-exit>
        <evaluate expression="myClass.persist()"/>
        <evaluate expression="flowScope.myList.add(myClass)"/>
    </on-exit>
</view-state>

とビューステートも同様に定義されconfirmています。は次のようになります。abortflow.xmlconfirm.jspx

<div xmlns:spring="http://www.springframework.org/tags" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:fn="http://java.sun.com/jsp/jstl/functions" xmlns:form="http://www.springframework.org/tags/form" xmlns:util="urn:jsptagdir:/WEB-INF/tags/util" xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
<jsp:directive.page contentType="text/html;charset=UTF-8" />
<jsp:output omit-xml-declaration="yes" />
<form:form>
    <c:forEach items="${myList}" var="instance">
        <li>${instance.getField1()} ${instance.getField2()}</li>     
</c:forEach>
    <div class="submit">
        <input type="submit" id="success" name="_eventId_success" value="success"/>
        <input type="submit" id="cancel" name="_eventId_cancel" value="cancel" />
    </div>
</form:form>    
</div>

だから質問に:

私がヒットするたびにconfirm.jspx、Web リターンは、org.springframework.webflow.engine.impl.FlowExecutionImpl.wrap(FlowExecutionImpl.java:569) で例外がスローされたことを示しています。

編集: Apache ログはもう少し啓発的です。以下は、コール スタックの上部のスニペットです。

SEVERE: Servlet.service() for servlet jsp threw exception org.apache.jasper.JasperException: 
/WEB-INF/views/myflow/confirmation.jspx(6,7)
The function getField1 must be used with a prefix when a default namespace is not specified
    at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)

ArrayList アプローチが可能かどうかはわかりません。-state で定義されているように、flowScope.myClass インスタンスがmulti-instanceGC によって取得されるか、少なくとも範囲外になることをどこかで読んだことがあると思います。わからない。誰かがその特定のトピックに光を当てることができれば、私はわくわくします.

(そして、これらの永続化されたエンティティのリストを保持するためのより良い方法を知っている場合は、お気軽にお知らせください!) よろしくお願いします! :)

更新: リスト内の要素の数を次のように数えることができます:

<c:choose>
    <c:when test="${myList != null}">myList exists, it contains <c:out value="${fn:length(myList)}" /> items!</c:when>
    <c:otherwise>myList doesn't exist.</c:otherwise>
</c:choose>

挿入したのと同じ数の要素が表示されます。ただし、これを行うと:

<c:forEach items="${myList}" var="instance">
    <c:if test="${instance != null}">
        <li>${instance.field1} ${instance.field2}</li>
    </c:if>
</c:forEach>

何も表示されません。(null テストを省略した場合、正しい数の <li> 要素があることを確認できます。また、ここに示されているように、プロパティに直接アクセスしようとしていることにも注意してください: jstl/jsp - ベクトルの反復処理Bean ) ここでのスコープに関して、どう考えればよいかわかりませんが、ArrayList を介してエンティティにアクセスできないことは明らかです。

4

1 に答える 1

1

まず、変数のスコープに関する質問については、SWF ドキュメントのセクション4.4を参照することをお勧めします。ここでは、使用可能なさまざまなスコープがすべて説明されています。

フロー スコープ変数は、フローの存続期間中存続します。したがって、フローが終了するまで myClass 変数は消えません。ただし、<on-entry>そのビュー ステートに入るたびに式が新しいインスタンスを割り当てていることに注意してください。

第二に、あなたのソリューションはおそらく正しい方向に進んでいると思います。私はいくつかのことに注意します:

  1. 要素内のリストに永続化して追加しています。これは、遷移<on-exit>を行っているときを含め、状態を離れるときに、これら 2 つのことが常に発生することを意味します。cancelこれはあなたが望むものではないかもしれません。関連している:
  2. あなた<transition on="another_instance" to="multi-instance"/>は実際にビューステートを終了して再入力し、<on-exit>and<on-entry>ロジックをトリガーしています。を行うだけで、同じ状態を維持することができ<transition on="another_instance">ます。これを行うと、トランジション内にあるロジックが実行され、実際に状態を変更せずにビューが再レンダリングされます。
  3. <var>タグを使用して変数を初期化することを検討したい場合があります...あなたが行っていることは機能します<evaluate expression="new ..."/>が、使用する方<var>がきれいかもしれません。また、言うまでもありませんresult-type="java.io.Serializable"result-type戻り値の型を別のものに変換する必要がある場合に使用する必要があります。

最後に、発生しているエラーは webflow とは無関係のようです。JSTL/EL では、Bean プロパティにアクセスできますが、メソッドにはアクセスできません。メソッドを呼び出そうとしています。詳細については、この質問を参照してください。

于 2011-06-01T20:45:17.210 に答える