2016-12-25 11 views
0

有一個要求,我必須根據特定條件返回兩個不同對象的列表。 我已經配置了payload-type-router,如下所述,但它沒有配置默認通道。如何配置付費負載類型路由器的不同對象列表的類型?

<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" /> 

如果缺省信道被配置成然後它將該消息發送到缺省信道僅無關型的。

請讓我知道我做錯了什麼。提前致謝。

回答

0

由於類型擦除,有效負載類型路由器當前不支持泛型類型 - 將有效負載類名稱(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); 
    } 

} 
+0

感謝您的快速反應。對於語法來說,這只是這個論壇上的錯字。對不起。 – Vivek

相關問題