我希望能够发送,例如使用List<String>
的{{1}}类型的值,然后使用带JmsTemplate.convertAndSent(...)
注释的方法接收它,该方法采用@JmsListener
类型的参数。
但是,将消息有效内容类型存储为消息属性的默认方法似乎不支持泛型。
如果我查看List<String>
,我会看到:
MappingJackson2MessageConverter.getJavaTypeForMessage(Message)
所以看起来只能从Class<?> typeClass = ClassUtils.forName(typeId, this.beanClassLoader);
return this.objectMapper.getTypeFactory().constructType(typeClass);
到typeId
并且无法访问Class<?>
的实例。
在这里我是否缺少一些巧妙的混合类型参数信息的方法?例如。以某种方式使用ParameterizedType
?
答案 0 :(得分: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
的{{1}}子类(然后将我的真实列表的内容复制到一个实例中,那就更好了) List
)。