2016-08-19 3 views
0

私はSIを使い始めました。service-activatorでconstructor-argの値としてペイロードを設定する方法

サービスアクティベータとして使用するBeanは、Javaオブジェクトのコンストラクタ引数を受け取ります。オブジェクト

は、ペイロードであるが、その後、私はそれが不満のサービスベーターの内側の豆の使用量に

<service-activator input-channel="ADMIN_TEST_CONNECTION" method="testConnection"> 
    <beans:bean class="mypackage.request.AdminRequestProcessor"> 
       <beans:constructor-arg value="payload"/> 
      </beans:bean> 
</service-activator> 

を使用して設定することができないんだタイプの引数の値を変換できませんでした[java.lang.Stringで]を必要なタイプに変更します。

ペイロードにアクセスしてコンストラクタの引数として設定する方法をお手伝いしてください。

私は非コンストラクタ引数経路を介して移動して、既存のJavaオブジェクトを変更した場合、それは「bean.testConnection(ペイロード)@」=サービスアクティベータ

式の中で、この呼び出しで動作します/>

が、他の方法がない限り、既存のjavaコードを変更することは望ましくありません。

答えて

0

何かを変更したり、既存のコードを追加したりしない限り、選択肢はありません。

Service-Activatorは、input-channelの各着信メッセージに対してその機能を実行します。その機能は、メソッド呼び出しのコンテキストとしてMessageが使用されているメソッド呼び出しとまったく同じです。

あなたはそのペイロードで何をしようとしているのかよく分かりませんが、AdminRequestProcessorのようなstatefullオブジェクトを使用するのは正しくありません。多くの着信メッセージがあるかもしれませんが、service-activatorは一貫している必要があることを忘れないでください。

プラス<beans:bean>singletonであることを忘れないでください。AdminRequestProcessorは1回だけインスタンス化されます。あなたが本当にあなたのコード内で何かを変更したくない場合は

expression="new AdminRequestProcessor(payload).testConnection()"/> 

あなたのサンプルを見ると、私はこのようなものをお勧めしたいです。

残りの部分はすべてReference Manualにあります。

+0

こんにちはArtem、サービスアクティベータクラス名を私の場合と同じように動的に使用することは可能ですか?expression = "'new' + payload.type + 'Processor'(ペイロード)と言うことができます。 testConnection() "/> – sonu131

+0

Mmm。申し訳ありませんが、あなたの質問は明確ではありません。それは、「クラスを動的に使用する」とはどういう意味ですか?それは、 "実行時にキャストする方法"のような質問を思い出してくれました。おそらく私の側からローカルに再生するための適切な情報と設定/テストケースを持つ新しいSOスレッドですか? –

+0

http://stackoverflow.com/questions/39171203/how-to-name-and-initialize-a-class-of-a-service-activator-dynamically – sonu131

関連する問題