Spring JMS和参数化类型(@JmsListener,例如List <string>参数)?

时间:2017-06-13 11:34:37

标签: generics spring-jms jmstemplate

我希望能够发送,例如使用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

1 个答案:

答案 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)。