通过不同的操作实现重用Spring Webflow定义
我有相当大的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专家知道其他以不太笨拙的方式做事的方式...