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

发布于 2024-07-05 11:39:04 字数 218 浏览 6 评论 0原文

我有相当大的网络流定义,我不想复制/粘贴以重用。 XML 中有对action bean 的引用,这是很自然的。

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

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


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

I got pretty big webflow definition, which I do not want to copy/paste for reusing. There are references to action bean in XML, which is kind natural.

I want to use same flow definiton twice: second time with actions configured differently (inject different implementation of service to it).

Is there easy way to do this?


Problem is I want to use same flow with different beans at once, in the same app. Copy/Paste is bad, but I dont see other solution for now.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

云之铃。 2024-07-12 11:39:04

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

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

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

I don't think you can use the same webflow definition with the actions configured in two different ways.

If you want to use different actions you'll either have to reconfigure your action beans then redeploy your app or create a separate webflow definition with the differently configured beans.

This is a great Spring WebFlow resource.

柳絮泡泡 2024-07-12 11:39:04

您可以尝试创建一个扩展“相当大的流”的新流并向其中添加 flowExecutionListeners。

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

  • requestSubscribed
  • requestProceessed
  • sessionCreating
  • sessionStarting
  • sessionStarted
  • eventSignaled
  • transitionExecuting
  • stateEntering
  • viewRendered
  • viewRendering
  • stateEntered
  • Paused
  • resumeing
  • sessionEnding
  • sessionEnded
  • exceptionThrown

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

请注意,在这种情况下,您仍然需要修改“相当大的流程”才能使用这些资源,而不是直接引用 bean。

You could try creating a new flow that extends the "pretty big one" and adding flowExecutionListeners to it.

The interface "FlowExecutionListener"defines methods for the following events in flow execution:

  • requestSubmitted
  • requestProceessed
  • sessionCreating
  • sessionStarting
  • sessionStarted
  • eventSignaled
  • transitionExecuting
  • stateEntering
  • viewRendered
  • viewRendering
  • stateEntered
  • paused
  • resuming
  • sessionEnding
  • sessionEnded
  • exceptionThrown

You can write a handler that injects the required resources to your flow (and use different handles with different flows) by storing it in the RequestContext, where you can access it in your flow definition.

Note that in that case you would still have to modify the "pretty big flow" to use those resources instead of referencing the beans directly.

泼猴你往哪里跑 2024-07-12 11:39:04

我与您处于相同的修复中...我有不同的子类,它们具有相应的操作 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,但现在它引用我刚刚执行的“设置”的结果。

好消息——正确的 bean 被调用了。

坏消息 - 流范围内的任何内容都需要可序列化,所以我得到一个 NotSerializedException - arggh!

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

顺便说一句,我正在使用 Spring 2.5.6 和 webflow 2.0.7。 以后的版本可能有更好的方法来处理这个问题; 尤其是,EL 似乎已经引起了一些关注。 我仍然坚持使用 OGNL,即 Spring 1.x EL。

我确信一些网络流大师知道以不那么笨拙的方式做事的其他方法......

I'm in the same fix that you're in...i have different subclasses which have corresponding action beans, but a lot of the flow is the same. In the past we have just copied and pasted...not happy with that!
I have some ideas I am going to try out with using the expression language. First, I came up with an action bean factory that will return the right action bean to use for a given class, then i can call that factory to set a variable that i can use instead of the hard-coded bean name.

Here's part of the flow:

<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"/>

The evaluate in the last line would normally refer directly to a bean, but now it refers to the result of the "set" I just did.

Good news--the right bean gets called.

Bad news--anything in the flow scope needs to be Serializable, so I get a NotSerializableException--arggh!

I can try setting something on a very short-lived scope, in which case it will need to get called all the time...or I can figure out some kind of proxy which holds the real bean as a proxy declared "transient".

BTW, I am using Spring 2.5.6 and webflow 2.0.7. Later versions may have better ways of handling this; in particular, EL's have gotten some attention, it seems. I'm still stuck with OGNL, which is the Spring 1.x EL.

I'm sure some webflow guru knows other ways of doing things in a less clunky fashion...

岁月无声 2024-07-12 11:39:04

尝试重构 subflow< 中的常见可配置部分/a>,并从要重用它的不同主流程中调用子流程。

将参数传递给子流以按照任何需要的方式对其进行配置,使用 spring 表达式语言传递不同的 spring bean 等。

Try to refactor the common configurable part in a subflow, and call the subflow from the different main flows where you want to reuse it.

Pass parameters to the subflow to configure it in any way needed, using the spring expression language to pass different spring beans, etc.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文