Spring Integration中payload-type-router能否路由List负载及XML配置方案
配置支持性说明
你给出的payload-type-router配置本身是被Spring Integration支持的,java.util.List作为合法的类型可以直接配置为映射规则。
你遇到的既不路由也不报错的问题,通常来自两个原因:
- 默认情况下
payload-type-router的resolution-required属性为false,当没有匹配到任何路由规则时不会抛出异常;如果同时没有配置default-output-channel兜底通道,消息会被直接丢弃,就会出现你观察到的无任何反馈的现象。 - 泛型擦除不会影响
List接口本身的匹配,但如果你的实际payload是List的某个特殊自定义子类,可能会出现类型匹配失败的问题,可以先给路由添加resolution-required="true"属性,开启强制校验,确认是否是规则未匹配导致的问题。
List类型路由场景的XML配置替代方案
如果需要更灵活的List类型匹配,比如要区分带不同泛型的List实例(payload-type-router无法识别泛型参数,因为运行时泛型会被擦除),可以用以下两种方案:
方案1:SpEL表达式路由
直接通过SpEL表达式编写类型判断逻辑,支持自定义更复杂的校验规则,示例配置如下:
<int:router input-channel="run-router-channel" expression="T(java.util.List).isInstance(payload) ? 'run-channel' : (payload instanceof T(com.foo.req.BlRunnerRequest) ? 'runner-channel' : null)" resolution-required="true"> <int:mapping value="run-channel" channel="run-channel"/> <int:mapping value="runner-channel" channel="runner-channel"/> </int:router>
如果需要判断List内部的元素类型,还可以扩展表达式逻辑,例如判断第一个元素的类型:expression="payload instanceof java.util.List and !payload.isEmpty() and payload[0] instanceof T(com.foo.req.OtherRequest) ? 'other-channel' : 'run-channel'"
方案2:自定义路由实现类
自行编写路由判断逻辑,适合复杂的业务校验场景:
- 首先编写路由处理类
public class CustomPayloadRouter { public String route(Object payload) { if (payload instanceof List<?>) { // 可自定义任意判断逻辑,比如校验List元素类型、长度等 return "run-channel"; } else if (payload instanceof BlRunnerRequest) { return "runner-channel"; } throw new IllegalArgumentException("不支持的消息载荷类型:" + payload.getClass().getName()); } }
- 注册Bean并配置路由
<!-- 注册自定义路由Bean --> <bean id="customPayloadRouter" class="com.xxx.CustomPayloadRouter"/> <!-- 配置路由 --> <int:router input-channel="run-router-channel" ref="customPayloadRouter" method="route" resolution-required="true"/>
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

