1

2つのチャネルで同様のサービスを提供するコードベースを継承しました。

  1. REST/HTTP-注釈付きのSpringコントローラーによって処理されます
  2. JMS-メッセージ駆動型POJOによって処理されます

両方のチャネルのメッセージ構造は多かれ少なかれ類似しているため、コントローラーとJMSリスナーには多くの冗長/重複処理ロジックがあります。これを修正する1つの方法は、共通ロジックを別のコンポーネントに抽出し、そのコンポーネントを@ControllerとJMSリスナーの両方に挿入することです。

今のところそれをする時間がないとしましょう。コントローラをJMSリスナーに挿入し、RESTリクエストが到着したときにSpringのディスパッチャサーブレットによって自動的に呼び出されるのと同じコントローラメソッドを呼び出す方法はありますか?コントローラのXML設定がないので、JMSリスナーに挿入するための参照を取得するにはどうすればよいですか?別の「id」を持つ別のコントローラーBeanを作成したくありません。

4

1 に答える 1

2

これを修正する1つの方法は、共通論理を抽出することです。

それは「一方向」ではなく、唯一の方法です。コントローラをJMSメッセージリスナーに挿入することが、アーキテクチャに対して実行できる最も厄介なことの1つであるという理由だけではありません。しかし、Spring自体はこれを許可しないためです。

Spring MVCには、実際には2つのコンテキストがあります。メインコンテキスト(JMSリスナーが宣言される場所)とDispatcherServlet(MVC)コンテキストです。後者は前者の子です。つまり、メインコンテキストからBeanにアクセスできます(そうでない場合、コントローラーのサービスとDAOにアクセスできません)が、その逆はできません。

今のところそれをする時間がないとしましょう

現在のアーキテクチャがかなり貧弱であるという事実は、それをさらに悪化させることを正当化するものではありません。おそらく、過去の一部の開発者は、共通論理を抽出する時間がなかったため、重複していました。ここで、JMSレイヤーからWebレイヤーへの非常に珍しい依存関係を導入したいと思います...私はむしろ重複して生きたいと思います。

コントローラのXML設定がないので、どうすればその参照を取得できますか

念のために言っておきますが、コントローラーに名前が付けられている場合は、次のようになりますFooBarController

@Resource
private FooBarController fooBarController;

動作する可能性がありますが、幸いなことに、親から子へのコンテキストでは機能しません。

于 2012-07-16T20:39:41.820 に答える