0

Spring Integration を使用してメッセージをルーティングする Web アプリを開発していますが、ヘッダー値の受け渡しに問題があります。メッセージはルーターとサービス アクティベーターを通過します。

ヘッダー値は私のルーターのルーティング方法で利用できるので問題ないようです。これは問題ではないと仮定しましょう (サービス アクティベーターを無効にして確認しました)。

私のサービス アクティベーター メソッドに関しては、次のエラーがスローされます

my-spring-integration.xml

<channel id="route" />
<service-activator method="process" input-channel="route" ref="myService" output-channel="myOutputChannel" />

MyRouter.java

@Component
public class MyRouter {

   public String router(String message, @Header("isValid") boolean isValid) {
      // isValid is "true"
      return "route";
   } 

}

MyService.java

@MessageEndpoint
@Transactional
public class MyService {

   public void process(String message, @Header("isValid") boolean isValid) {
      ...
   }

}

何故ですか?ルーティング後にヘッダー値は消去されますか? それとも私の設定が間違っていますか?プロセス メソッドに @ServiceActivator アノテーションを追加しようとしましたが、役に立ちませんでした。どんな助けでも大歓迎です。

4

2 に答える 2

1

@Transactionalこれは、インターフェイスを実装していない Service に注釈があることが原因だと思います。

Spring は、JDK 動的プロキシを使用してトランザクション ロジックを実装します。これらは、適切なインターフェイスを実装するプロキシ クラスに依存します。これに関する Spring ブログがここにあります

これを修正するには、プロセスと呼ばれる単一のメソッドを持つ MyService と呼ばれるインターフェースを作成することをお勧めします。次に、このインターフェイスを実装するサービスを提供します。

于 2012-06-26T02:17:01.117 に答える
0

私はレガシーコードを扱っていますが、おそらく古い春の統合バージョンが原因でした。私のアプリケーションは「@Headers」をサポートしていますが、「@Header」アノテーションをサポートしていません。@Header アノテーションは、インターフェースであるルーターで受け入れられましたが、インターフェースを実装していないサービスアクティベーターでは受け入れられませんでした。spring integration または cglib の古いバージョンが原因であると思われます。

于 2012-06-27T08:49:11.627 に答える