Spring Webflow:如何在转换期间将属性从一个流传递到另一个流?

Nic*_*ote 9 spring-webflow

我有一个动作状态,它评估一个表达式,然后根据结果转换到各种其他状态.结果状态之一是将子流控制到另一个流的子流状态,例如;

<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>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我可以通过输入标记将输入传递给子流,但我的问题是,当且仅当从转换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>
Run Code Online (Sandbox Code Playgroud)

Joh*_*int 15

有三种方法可以做到这一点.您可以通过对话,会话或传入的属性来完成此操作.

  • 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>
Run Code Online (Sandbox Code Playgroud)

在你的子流的xml中

<?xml version="1.0" encoding="UTF-8"?>
<flow>
    <input name="someNumber"/>
    <input name="someNumber2"/>
    ...
</flow>
Run Code Online (Sandbox Code Playgroud)

在此示例中,someNumber和someNumber 2作为属性传递给子流.您可以将其评估为${someNumber}

编辑:

这是为了解决您的评论问题.如果您想在特定转换的会话范围中设置变量,您可以执行以下操作:

<transition on="WORKFAIL" to="fixFail" >
  <set name="conversationScope.someVariable" value="Hello World"/>
</transition>
Run Code Online (Sandbox Code Playgroud)

然后在你的jsp中

${someVariable}  <!-- This will print out 'Hello World' -->
Run Code Online (Sandbox Code Playgroud)