有一个要求我要根据某些条件返回两个不同对象的列表。 我已经配置了如下所述的有效负载类型路由器,但它正在抛出非默认通道配置。
<int:payload-type-router input-channel="routingChannel">
<int:mapping type="java.util.list<pkg.class1>" channel="Channel1" />
<int:mapping type="java.util.list<pkg.class2>" channel="Channel2" />
如果配置了默认频道,则只会将消息发送到默认频道而不考虑类型。
请让我知道我做错了什么。提前谢谢。
答案 0 :(得分:1)
由于类型擦除,有效内容类型路由器当前不支持泛型类型 - 将有效内容类名称(java.util.List
)与您配置的字符串进行比较。我们可以通过解析字符串来处理这样的简单类型,也可以使用ParameterizedTypeReference
和Java配置来处理更复杂的泛型类型。但是今天没有这样的支持。
随意打开JIRA Issue,我们会考虑将其用于未来的改进。
即使有这样的支持,你的语法也很糟糕; java.util.list
应为java.util.List
,<
应为<
。
您的字符串永远不会匹配有效负载类型的类名(使用已擦除的泛型);这就是所有消息都转到默认频道的原因。
同时,您可以创建一个简单的POJO路由器方法来检查列表中的对象并返回相应的通道名称。
修改强>
这是一个带POJO路由器的启动应用程序:
@SpringBootApplication
public class So41324522Application {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(So41324522Application.class, args);
MessageChannel channel = context.getBean("routingChannel", MessageChannel.class);
channel.send(new GenericMessage<>(Collections.singletonList("Foo")));
channel.send(new GenericMessage<>(Collections.singletonList(42)));
context.close();
}
@Router(inputChannel = "routingChannel")
public String route(List<Object> payload) {
if (payload.size() == 0) {
return null;
}
if (payload.get(0) instanceof Integer) {
return "integerChannel";
}
else {
return "stringChannel";
}
}
@ServiceActivator(inputChannel = "integerChannel")
public void handleInt(List<Integer> in) {
System.out.println("INT: " + in);
}
@ServiceActivator(inputChannel = "stringChannel")
public void handleStr(List<String> in) {
System.out.println("STR: " + in);
}
}