通过不同的操作实现重用Spring Webflow定义

时间:2020-03-06 14:26:16  来源:igfitidea点击:

我有相当大的webflow定义,我不想复制/粘贴以便重复使用。 XML中有对动作bean的引用,这很自然。

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

有没有简单的方法可以做到这一点?

问题是我想在同一应用程序中一次将同一流与不同的bean一起使用。复制/粘贴不好,但是我暂时没有其他解决方案。

解决方案

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

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

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

我们可以尝试创建一个新的流程来扩展"相当大的流程",并向其中添加flowExecutionListeners。

接口" FlowExecutionListener"为流执行中的以下事件定义方法:

  • requestSubmitted
  • 要求进行
  • sessionCreating
  • sessionStarting
  • sessionStarted
  • eventSignaled
  • 执行过渡
  • 状态进入
  • viewRendered
  • viewRendering
  • stateEntered
  • 已暂停
  • 恢复
  • sessionEnding
  • sessionEnded
  • 抛出异常

我们可以编写一个处理程序,将其存储在RequestContext中,从而将所需的资源注入到流程中(并在不同的流程中使用不同的句柄),我们可以在其中在流程定义中对其进行访问。

请注意,在那种情况下,我们仍然必须修改"相当大的流量"以使用这些资源,而不是直接引用Bean。

我在与我们所处的位置相同的修复程序中...我有不同的子类,这些子类具有相应的动作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,但是现在它引用的是我刚做的"设置"的结果。

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

坏消息-流范围中的任何内容都需要可序列化,所以我收到NotSerializableException-太好了!

我可以尝试在一个非常短的范围内设置某些东西,在这种情况下,它需要一直被调用...或者我可以找出某种代理来将实际bean作为声明为" transient"的代理来保存。

顺便说一句,我正在使用Spring 2.5.6和Webflow 2.0.7. 更高的版本可能有更好的方法来处理此问题。看来,EL特别引起了人们的注意。我仍然坚持使用OGNL,即Spring 1.x EL。

我敢肯定,一些webflow专家知道其他以不太笨拙的方式做事的方式...