質問をすることで、問題について考えざるを得なくなったのだと思います。
私の質問への答えはこれです:
ゲートウェイは、ペイロードとして 1 つのパラメーターのみを受け取ります。残りは、カスタム名を持つヘッダーフィールドに送られます。したがって、私の場合、次のようにします。
@Gateway (requestChannel = "incomingAdhocQuery")
public ResultSet search(@Payload Query query, @Header("fetchSpec") FetchSpec fetchSpec);
@Gateway (requestChannel = "incomingPersistedQuery")
public ResultSet search(@Payload int queryId, @Header("fetchSpec") FetchSpec fetchSpec);
どのパラメーターがペイロードで、どれがヘッダーであるかを定義します。次に、各メソッドは、サービスをアクティブ化するためにメッセージを特定のチャネルに送信します。
構成では、ゲートウェイを次のように定義します。
<int:gateway service-interface="my.company.search.Search" />
次に、ゲートウェイ方式ごとに 1 つの特定の構成で検索サービスをアクティブにします。
<bean id="myManager" class="my.company.search.MyManager"/>
<int:service-activator input-channel="incomingAdhocQuery" expression="@myManager.fetchByQuery(payload, headers['fetchSpec'])"/>
<int:service-activator input-channel="incomingPersistedQuery" expression="@myManager.fetchById(payload, headers['fetchSpec'])"/>
このようにして、マネージャーを次のように設計します。
public ResultSet fetchById(int queryId, FetchSpec fetchSpec) {...}
public ResultSet fetchByQuery(Query query, FetchSpec fetchSpec) {...}
サービスでSpringに依存する必要がないため、このソリューションは非常にエレガントだと思います。ゲートウェイのみがこの依存関係を持つ必要があります。配線はすべてスプリング構成で行われます。私は春の統合に恋をしていると思います:-D