如何为不同对象列表的类型配置付费加载类型路由器?

时间:2016-12-25 21:07:27

标签: spring-integration

有一个要求我要根据某些条件返回两个不同对象的列表。 我已经配置了如下所述的有效负载类型路由器,但它正在抛出非默认通道配置。

<int:payload-type-router input-channel="routingChannel">
  <int:mapping type="java.util.list&ltpkg.class1&gt" channel="Channel1" />
  <int:mapping type="java.util.list&ltpkg.class2&gt" channel="Channel2" />

如果配置了默认频道,则只会将消息发送到默认频道而不考虑类型。

请让我知道我做错了什么。提前谢谢。

1 个答案:

答案 0 :(得分:1)

由于类型擦除,有效内容类型路由器当前不支持泛型类型 - 将有效内容类名称(java.util.List)与您配置的字符串进行比较。我们可以通过解析字符串来处理这样的简单类型,也可以使用ParameterizedTypeReference和Java配置来处理更复杂的泛型类型。但是今天没有这样的支持。

随意打开JIRA Issue,我们会考虑将其用于未来的改进。

即使有这样的支持,你的语法也很糟糕; java.util.list应为java.util.List&lt应为&lt;

您的字符串永远不会匹配有效负载类型的类名(使用已擦除的泛型);这就是所有消息都转到默认频道的原因。

同时,您可以创建一个简单的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);
    }

}