使用不同的动作实现重用Spring Webflow定义

时间:2008-09-19 14:50:09

标签: java spring spring-webflow

我有很大的webflow定义,我不想复制/粘贴重用。在XML中引用了action bean,这很自然。

我想使用相同的流定义两次:第二次使用不同的动作配置(向其注入不同的服务实现)。

有没有简单的方法呢?


问题是我想在同一个应用程序中同时使用不同bean的相同流程。复制/粘贴很糟糕,但我现在还没有看到其他解决方案。

4 个答案:

答案 0 :(得分:2)

您可以尝试创建一个扩展“非常大”的新流程,并向其添加flowExecutionListeners。

接口“FlowExecutionListener”定义流程执行中以下事件的方法:

  • requestSubmitted
  • requestProceessed
  • sessionCreating
  • sessionStarting
  • sessionStarted
  • eventSignaled
  • transitionExecuting
  • stateEntering
  • viewRendered
  • viewRendering
  • stateEntered
  • 暂停
  • 恢复
  • sessionEnding
  • sessionEnded
  • exceptionThrown

您可以通过将其存储在RequestContext中来编写一个为流注入所需资源(并使用具有不同流的不同句柄)的处理程序,您可以在其中在流定义中访问它。

请注意,在这种情况下,您仍然需要修改“非常大的流量”来使用这些资源,而不是直接引用bean。

答案 1 :(得分:1)

我和你在同一个修复程序中...我有不同的子类,它们有相应的动作bean,但很多流程是相同的。在过去,我们刚刚复制和粘贴...不满意! 我有一些想法,我将尝试使用表达式语言。首先,我想出了一个动作bean工厂,它将返回用于给定类的正确动作bean,然后我可以调用该工厂来设置一个我可以使用的变量而不是硬编码的bean名称。

这是流程的一部分:

<action-state id="checkForParams">
    <on-entry>
        <set name="flowScope.clientKey" value="requestParameters.clientKey"/>
        <set name="flowScope.viewReportBean" 
                 value="reportActionFactory.getViewBean(reportUnit)"/>
    </on-entry>
    <evaluate expression="viewReportBean"/>

最后一行的评估通常会直接引用一个bean,但现在它指的是我刚才所做的“set”的结果。

好消息 - 正确的bean被调用。

坏消息 - 流量范围内的任何内容都需要是Serializable,所以我得到一个NotSerializableException - arggh!

我可以尝试在一个非常短暂的范围内设置一些东西,在这种情况下它需要一直被调用...或者我可以找出某种代理,它将真正的bean保存为代理声明“瞬态”。

BTW,我使用的是Spring 2.5.6和webflow 2.0.7。更高版本可能有更好的方法来处理这个问题;特别是EL似乎得到了一些关注。我仍然坚持使用OGNL,这是Spring 1.x EL。

我确信一些webflow专家知道其他方式以不那么笨重的方式做事......

答案 2 :(得分:0)

我认为您不能将相同的Webflow定义与以两种不同方式配置的操作一起使用。

如果要使用不同的操作,则必须重新配置操作bean,然后重新部署应用程序或使用配置不同的bean创建单独的Webflow定义。

This是一个很棒的Spring WebFlow资源。

答案 3 :(得分:0)

尝试重构subflow中的公共可配置部分,并从要重用它的不同主流中调用子流。

将参数传递给子流,以任何方式配置它,使用spring表达式语言传递不同的spring bean等。