2017-06-13 53 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一个实例)。