2016-08-26 10 views
0

これは私の以前の質問How to set payload as constructor-arg value in service-activatorのフォローアップです。サービスアクティベータのクラスを動的に名前を付けて初期化する方法

私たちはAProcessor、Bprocessorなどの12種類のクラスを持っています。それぞれのコンストラクタは共通のペイロードを受け入れ、同じ宣言されたメソッドを 'publish'で実行します。

ここでは、SIで1つの共通チャネルとサービスアクティベータを扱うことを考えていましたが、どのようにしてpayload.typeから動的に式にクラス名を入れることができますか?

私は以下のような何かをしようとしていたが、そのは

<サービスベーター入力チャンネル= "COMMON_PUBLISH_CHANNEL" 表現= "動作しない '新しいmypackageとを。' + payload.type + 'のRequestProcessor'(payload.myservice ).publish(payload.data) "> < /サービスベーター>

私は、私は1つの場所で行うことができれば12のチャンネルとサービスの活性化因子を書いてから保存したいです。

答えて

0

私はこのようなロジックをJavaクラスに移行し、まだ<service-activator>の1つを持っていることを示唆しています。どのターゲットプロセッサを呼び出すか決定するための苦労はすべて、そこでサービスメソッドで実行する必要があります。

Spring柔軟性があり、それらの間のすべてのコンポーネントとチャネルとの統合がプログラミング言語であると誤解を招く可能性があります。実際の言語がJavaであり、その汎用機能を忘れてはいけません。

我々はSPELの魔法を使用して、とにかく春の統合であなたの願いを実現することができますが:私は前にてServiceRegistryを使用していませんでした私は置くことができるように

<chain> 
    <header-enricher name="service" expression="@serviceRegistry[payload.type]"/> 
    <service-activator expression="headers[service].process(payload)"/> 
<chain> 
+0

、あなたはそれのために、関連するリソースに私をポイントしてくださいすることができますそれのための右の豆など?ありがとう – sonu131

+0

そのようなものはありません。それはただの仮説的なコードでした。それがあればあなた自身のものを書くべきです。そして、はい、そこにJavaをバイパスすることはできません:-) –

+0

はい、Java Beanクラスで動作し、動作しています。 – sonu131

関連する問題