2016-05-12 121 views
1

是否可以配置Spring AMQP,以便它将自动将队列中的消息(实质上是JSON字符串)转换为所需类型的对象?自动将JSON字节从RabbitMQ队列转换为对象

我迄今为止尝试:

1)我的CFG:

<rabbit:listener-container connection-factory="rabbitConnectionFactory" message-converter="jsonMessageConverter"> 
    <rabbit:listener ref="foo" method="listen" queue-names="test_queue"/> 
</rabbit:listener-container> 
<bean id="foo" class="foo.FooListener"/> 
<bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.JsonMessageConverter"/> 

2)我的听众FooListener有方法listen(FooMessage foo) { ... }

3)我FooMessage只是简单的POJO和我的test_queue中的消息只是FooMessage的序列化实例JSON格式。

java.lang.NoSuchMethodException: foo.FooListener.listen([B)

所以它并不适用于listen(byte[] msg)方法工作,春季索赔。

可以吗?

回答

0

请阅读documentationJackson2JsonMessageConverter。 并注意注意事项:

在1.6以前的版本中,如果类型信息不存在,转换将失败。从版本1.6开始,如果缺少类型信息,转换器将使用Jackson默认值(通常是地图)转换JSON。

因此,独立于POJO处理程序的目标参数类型,MessageProperties必须包含__TypeId__信息。

为了满足您的要求,请考虑使用@RabbitListener来代替。

查看Spring AMQP 1.6新闻的相同部分。

虽然随意提出一个JIRA issue,我们可能会考虑一般MessageListenerAdapter一些钩子,我们通过listener ref="foo" method="listen"知道的方法,因此,可以推断出转换前的目标参数类型。

+0

我是否正确理解,在我的听众配置方式中,这还不可能? – Andremoniy

+0

所以,问题出在我的消息的内容类型不正确 – Andremoniy

0

嗯,实际上这个东西就像是一个魅力Spring AMQP甚至在1.6版之前。问题出在我的邮件的不正确content-type,它只是text/plain

如果具有json消息中适当的方式被发送时,说

template.convertAndSend("test_queue", "test_queue", new FooMessage("blablabla","blabla")); 

与正确安装template

<rabbit:template id="amqpTemplate" 
        connection-factory="rabbitConnectionFactory" 
        message-converter="jsonMessageConverter" 
        /> 
<bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter"/> 

所以方法listen(FooMessage foo) { ... }与来自消息FooMessage类型的自动创建的对象调用。