Spring Webflow: как передать атрибут из одного потока в другой во время перехода? - PullRequest
8 голосов
/ 05 января 2011

У меня есть состояние действия, которое оценивает выражение и затем переходит в другие состояния в зависимости от результата. Одним из состояний результата является состояние подпотока, которое передает управление другому потоку, например;

<action-state id="doWork">
    <evaluate expression="someAction.doWork(someInput)" />
 <transition on="WORKSUCCESS" to="workSuccess" />
 <transition on="WORKFAIL" to="fixFail" />
</action-state>

<subflow-state id="fixFail" subflow="someOtherPlace/someOtherWorkToFixFail">
    <input name="someNumber" value="1" type="java.lang.Integer" />
    <transition on="finish" to="workSuccess" />
</subflow-state>

Как вы можете видеть, я могу передать входные данные в подпоток через тег input, но у меня вопрос, как я могу указать и передать дополнительные входные данные, которые я хочу представить, если и только если состояние subflow вызывается из перехода WORKFAIL ? Предположим, что состояние подпотока «fixFail» может быть вызвано из других состояний действия.

Я пробовал что-то похожее на следующее без эффекта;

<action-state id="doWork">
    <evaluate expression="someAction.doWork(someInput)" />
 <transition on="WORKSUCCESS" to="workSuccess" />
 <transition on="WORKFAIL" to="fixFail">
            <attribute name="newInput" value="3000" type="java.lang.Integer" />
    </transition>
</action-state>

<subflow-state id="fixFail" subflow="someOtherPlace/someOtherWorkToFixFail">
    <input name="someNumber" value="1" type="java.lang.Integer" />
    <input name="someNumber2" value="flowScope.newInput" type="java.lang.Integer" />
    <transition on="finish" to="workSuccess" />
</subflow-state>

1 Ответ

14 голосов
/ 06 января 2011

Есть три способа сделать это.Вы можете сделать это через диалог, сеанс или как переданные атрибуты.

  • ConversationScope: если поле находится в conversationScope, поле видно в любом месте этого конкретного потока, а такжеподпотоки этого потока (и их переходы)

  • SessionScope: (вероятно, не то, что вам нужно) Видимо для всех потоков и
    их подпотоков

Наконец, вы можете передать поле в качестве атрибута в состояние подпотока, например

<subflow-state id="fixFail" subflow="someOtherPlace/someOtherWorkToFixFail">
    <input name="someNumber" value="1" type="java.lang.Integer" />
    <input name="someNumber2" value="flowScope.newInput" type="java.lang.Integer" />
    <transition on="finish" to="workSuccess" />
</subflow-state>

В xml

<?xml version="1.0" encoding="UTF-8"?>
<flow>
    <input name="someNumber"/>
    <input name="someNumber2"/>
    ...
</flow>

вашего подпотока в этом примере someNumber и someNumber два передаются какатрибуты вашего подпотока.В котором вы можете оценить их как ${someNumber}

Редактировать:

Это для ответа на вопрос вашего комментария.Если вы хотите установить переменную в области диалога для определенного перехода, вы можете сделать:

<transition on="WORKFAIL" to="fixFail" >
  <set name="conversationScope.someVariable" value="Hello World"/>
</transition>

Затем в вашем jsp

${someVariable}  <!-- This will print out 'Hello World' -->
...