Spring webflow: как отслеживать постоянные идентификаторы сущностей? - PullRequest
1 голос
/ 30 мая 2011

Я работаю над веб-потоком (SWF2). Сущности создаются с использованием Roo. Одно из представлений веб-потока, 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 и abort также определены в flow.xml. confirm.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, в веб-возврате говорится, что в 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; Я полагаю, что где-то читал, что экземпляр flowScope.myClass, как он определен в multi-instance -состоянии, извлекается GC или, по крайней мере, выходит из области видимости. Я не уверен. Если кто-нибудь сможет пролить свет на эту конкретную тему, я был бы в восторге.

(И если вам случится знать, как лучше вести список этих постоянных сущностей, пожалуйста, дайте мне знать!) Заранее спасибо! :)

Обновление: Я могу посчитать количество элементов в моем списке следующим образом:

<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>

ничего не отображается. (Я могу подтвердить, что существует правильное количество

-элементов, когда нулевой тест пропущен. Обратите внимание также, что я пытаюсь получить доступ к свойствам напрямую, как указано здесь: jstl / jsp - итерация по вектор бобов ) Я не знаю, что и думать об этом здесь, но кажется очевидным, что я не могу получить доступ к своим сущностям через ArrayList.

1 Ответ

1 голос
/ 02 июня 2011

Во-первых, что касается вашего вопроса (-ов) о переменной области видимости, я бы посоветовал взглянуть на раздел 4.4 документации SWF, где описываются все различные доступные области.

Переменные объема потока живут в течение всего времени существования потокаТаким образом, ваша переменная myClass не исчезнет, ​​пока поток не выйдет.Однако имейте в виду, что ваше выражение <on-entry> назначает новый экземпляр каждый раз, когда вводится состояние просмотра.

Во-вторых, я думаю, что вы, вероятно, находитесь на правильном пути с вашим решением.Я хотел бы отметить несколько вещей:

  1. Вы сохраняете и добавляете в свой список элемент <on-exit> - это означает, что эти две вещи всегда будут происходить при выходе из состояния, в том числе при выполненииваш cancel переход.Это может быть не то, что вы хотите.Related:
  2. Ваш <transition on="another_instance" to="multi-instance"/> фактически выходит из состояния просмотра и снова входит в него, вызывая логику <on-exit> и <on-entry>.Можно оставаться в том же состоянии, просто выполнив <transition on="another_instance">.Выполнение этой команды выполнит любую логику, имеющуюся внутри перехода, а затем повторно отобразит представление без фактического изменения состояний.
  3. Возможно, вы захотите использовать тег <var> для инициализации переменных.... то, что вы делаете с <evaluate expression="new ..."/>, работает, но использование <var> может быть чище.Также нет необходимости говорить result-type="java.io.Serializable".result-type следует использовать, когда вам нужно преобразовать тип возвращаемого значения во что-то еще.

Наконец, полученная ошибка выглядит так, как будто она не связана с веб-потоком.JSTL / EL позволяют вам получить доступ к свойствам бина, но не к методам, и вы пытаетесь вызвать метод.См. этот вопрос для получения дополнительной информации.

...