再利用のためにコピー/貼り付けしたくない、かなり大きなWebflow定義を取得しました。XML にはアクション Bean への参照がありますが、これは自然なことです。
同じフロー定義を 2 回使用したい: 2 回目は異なる設定のアクションで (異なるサービスの実装を注入する)
これを行う簡単な方法はありますか?
問題は、同じアプリで一度に異なる Bean で同じフローを使用したいことです。コピー/貼り付けは悪いですが、今のところ他の解決策はありません。
再利用のためにコピー/貼り付けしたくない、かなり大きなWebflow定義を取得しました。XML にはアクション Bean への参照がありますが、これは自然なことです。
同じフロー定義を 2 回使用したい: 2 回目は異なる設定のアクションで (異なるサービスの実装を注入する)
これを行う簡単な方法はありますか?
問題は、同じアプリで一度に異なる Bean で同じフローを使用したいことです。コピー/貼り付けは悪いですが、今のところ他の解決策はありません。
「かなり大きなもの」を拡張する新しいフローを作成し、それに flowExecutionListeners を追加してみてください。
インターフェース「FlowExecutionListener」は、フロー実行における次のイベントのメソッドを定義します。
フロー定義でアクセスできる 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を直接参照しますが、今は私が行った「セット」の結果を参照しています。
朗報です。適切なBeanが呼び出されます。
悪いニュース-フロースコープ内のすべてがシリアル化可能である必要があるため、NotSerializableException-argghが発生します!
非常に短命のスコープで何かを設定してみることができます。その場合、常に呼び出される必要があります...または、「一時的」と宣言されたプロキシとして実際のBeanを保持するある種のプロキシを見つけることができます。
ところで、私はSpring2.5.6とwebflow2.0.7を使用しています。それ以降のバージョンでは、これを処理するためのより良い方法がある可能性があります。特に、ELは注目を集めているようです。私はまだSpring1.xELであるOGNLで立ち往生しています。
一部のWebflowの第一人者は、それほど不格好な方法で物事を行う他の方法を知っていると確信しています...
2つの異なる方法で構成されたアクションで同じWebフロー定義を使用できるとは思いません。
異なるアクションを使用する場合は、アクションBeanを再構成してからアプリを再デプロイするか、異なる構成のBeanを使用して別のWebフロー定義を作成する必要があります。
これは素晴らしいSpringWebFlowリソースです。
サブフロー内の共通の設定可能部分をリファクタリングして、再利用したい別のメイン フローからサブフローを呼び出してみてください。
パラメータをサブフローに渡して、必要な方法で設定し、Spring 式言語を使用してさまざまな Spring Bean などを渡します。