0

Spring Roo によって MVC と永続化の足場を備えた Spring Webflow を作成しています。このフローでは、ユーザーが 1 つのエンティティの複数のインスタンスを作成し、それが別のエンティティから参照されることを想定しています。簡単にするために、これらのエンティティを MyClass1 と MyClass2 と呼びます。確認時に必要な、永続化されたエンティティのリストを保持する方法を理解するのに苦労しています。

以前、同じトピックに関する質問を投稿しました。ただし、私の問題をさらに明確にするために元の質問を(さらに)編集すると、SO「プロトコル」に違反することになるので、元の質問の洗練されたバージョンを尋ねることにしました。振り返ってみると、元の質問はもっと正確であるべきだったと思います。私はおそらくこれについて熱くなるだろうが、この質問は(少なくとも私にとっては!)それを取るのに十分重要であると感じている. :)

誰でも簡単にセットアップを再現できるように、roo-script を含めています。ここにあります:

project --topLevelPackage com.test.webflow
persistence setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY
entity --class ~.domain.Class1 --testAutomatically 
field string --fieldName name
entity --class ~.domain.Class2 --testAutomatically 
field string --fieldName name
field reference --fieldName class1 --type ~.domain.Class1
controller scaffold --class ~.web.Class1Controller --entity ~.domain.Class1
controller scaffold --class ~.web.Class2Controller --entity ~.domain.Class2
web flow --flowName registration

/WEB-INF/views/registration の flow.xml は次のようになります。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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">
    <on-start>
        <evaluate expression="new java.util.ArrayList()" result="flowScope.myList" result-type="java.io.Serializable"/>
    </on-start>
    <view-state id="view-state-1" view="registration/view-state-1" model="class1">
        <on-entry>
            <evaluate expression="new com.test.webflow.domain.Class1()" result="flowScope.class1"/>
        </on-entry>
        <transition on="repeat" to="view-state-1"/>
        <transition on="success" to="view-state-2"/>
        <transition on="cancel" to="end-state"/>
        <on-exit>
            <evaluate expression="class1.persist()" result="flowScope.class1"/>
            <evaluate expression="myList.add(class1)"/>
        </on-exit>
    </view-state>    
    <view-state id="view-state-2" view="registration/view-state-2">
        <transition on="cancel" to="end-state"/>
    </view-state>    
    <end-state id="end-state" view="registration/end-state"/>   
</flow>

(フローの実際のバージョンでは、Class2 のエンティティが登録される別のビューステートがあります。) 次のview-state-1.jspxようになります。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<div xmlns:spring="http://www.springframework.org/tags" xmlns:form="http://www.springframework.org/tags/form" xmlns:fn="http://java.sun.com/jsp/jstl/functions" 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" />
    <spring:message var="title" code="webflow_state1_title" htmlEscape="false" />
    <util:panel id="title" title="${title}">
        <h1>${fn:escapeXml(title)}</h1>
        <p>
            <spring:message code="webflow_state1_message" />
        </p>
        <form:form commandName="class1">
            <input type="hidden" name="_flowExecutionKey" value="${flowExecutionKey}" />
            <p>Enter name: <form:input path="name"/></p>
            <div class="submit">
                <spring:message var="cancel" code="button_cancel" htmlEscape="false" />
                <spring:message var="proceed" code="button_proceed" htmlEscape="false" />
                <spring:message var="repeat" code="button_repeat" htmlEscape="false" />
                <input type="submit" id="cancel" name="_eventId_cancel" value="${fn:escapeXml(cancel)}" />
                <input type="submit" id="success" name="_eventId_success" value="${fn:escapeXml(proceed)}" />
                <input type="submit" id="repeat" name="_eventId_repeat" value="${fn:escapeXml(repeat)}" />
            </div>
        </form:form>
    </util:panel>
</div>

は次のview-state-2.jspxようになります。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<div xmlns:spring="http://www.springframework.org/tags" xmlns:fn="http://java.sun.com/jsp/jstl/functions" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:util="urn:jsptagdir:/WEB-INF/tags/util" xmlns:form="http://www.springframework.org/tags/form" 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" />
    <spring:message var="title" code="webflow_state2_title" htmlEscape="false" />
    <util:panel id="title" title="${title}">
        <h1>${fn:escapeXml(title)}</h1>
        <p>
            <spring:message code="webflow_state2_message" />
        </p>
        <p>
            <c:forEach var="class1" items="${myList}">
                <li><c:out value="${class1.name}"/></li>
            </c:forEach>
        </p>
    </util:panel>
</div>

これまで読んだすべてから、私のソリューションはうまくいくはずだと思います。ただし、期待される出力はまだ得られません。つまり、すべてのname-field を出力します。入力したのと同じ数の <li> 要素を取得しますが、以前の投稿で説明したように、それらはすべて null と評価されるようです。このコードが永続化された Class1.name-fields の内容を表示しない理由を誰かに説明できますか? (ちなみに: それらは CRUD に表示されます。)

前もって感謝します!

4

1 に答える 1

1

DO-(freakin')-H! の署名はClass1.persist()ですpublic void Class1.persist()へん。そう

<evaluate expression="class1.persist()" result="flowScope.class1"/>

どうやら、非常に効果的にflowScope.class1変数をnullに設定します。-属性を削除resultすることで、あなたの (そして私の!) 問題が解決されます。:)

于 2011-06-05T17:46:28.227 に答える