我想问这个问题是在迫使我思考这个问题。
我的问题的答案是这样的:
网关将 ONE 参数作为有效负载 - 其余参数转到具有自定义名称的标题字段。所以就我而言,我会这样做:
@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" />
然后我为每种网关方法使用一个特定配置激活搜索服务:
<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 有任何依赖。只有网关需要这种依赖。接线全部在弹簧配置中完成。我想我爱上了 spring-integration :-D