2017-06-13 50 views
1

我希望能夠發送List<String>類型的值使用JmsTemplate.convertAndSent(...),然後使用註釋爲@JmsListener的方法接收它,該方法採用類型爲List<String>的參數。Spring JMS和參數化類型(@JmsListener,例如列表<String>參數)?

但是,似乎將消息有效內容類型存儲爲消息屬性的默認方法不支持泛型。

如果我期待在MappingJackson2MessageConverter.getJavaTypeForMessage(Message)我看到:

Class<?> typeClass = ClassUtils.forName(typeId, this.beanClassLoader); 
return this.objectMapper.getTypeFactory().constructType(typeClass); 

所以它看起來像一個只能從typeId得到一個Class<?>,並且沒有辦法去的ParameterizedType一個實例。

在這裏我缺少的類型參數信息中是否有一些巧妙的混合方式?例如。不知何故使用ParameterizedTypeReference

回答

1

我已經能夠做的最好的事情是在發送端創建我的參數化類型的子類。例如。我有:

public class StringList extends ArrayList<String> { 
    public StringList(Collection<String> c) { 
     super(c); 
    } 

    // Empty constructor needed by Jackson. 
    public StringList() { } 
} 
在我發送邏輯

然後,我有:

template.convertAndSend("my-destination", new StringList(myList)); 

即我必須將我的List<String>轉換爲StringList,以便傳出消息將標記爲類型StringList

然後在接收端,我可以假裝StringList不存在,只是使用List<String>像這樣:

@JmsListener(destination = "my-destination") 
public void consumerList(List<String> list) { ... } 

即傑克遜在封面下創建了一個StringList的實例,但我將其作爲List<String>使用。

這不是太可怕了 - 但它會是更好,如果沒有必要創建StringList子類的List(然後我真正的名單中的內容複製到的StringList一個實例)。