2016-02-19 53 views
3

我正在使用Spring Cloud Stream和RabbitMQ联编程序。它与byte[]有效负载和Java本地串行化非常相称,但我需要使用JSON负载。从/到JSON转换配置的Spring Cloud Stream消息

这是我的处理器类。

@EnableBinding(Processor.class) 
public class MessageProcessor { 
    @ServiceActivator(inputChannel = Processor.INPUT, outputChannel = Processor.OUTPUT) 
    public OutputDto handleIncomingMessage(InputDto inputDto) { 
     // Run some job. 
     return new OutputDto(); 
    } 
} 

InputDtoOutputDto与杰克逊注解的POJO。

  • 如何配置JSON转换策略?
  • 消息头应该如何被接受和处理?

回答

6

在消费者中,您可以添加内容类型配置,例如,

spring.cloud.stream.bindings.input.content-type: application/x-java-object;type=my.package.InputDto 

您还可以添加

spring.cloud.stream.bindings.output.content-type: application/json 

强制传出消息的有效载荷是JSON(互操作等)。

请注意,“输入”和“输出”是绑定器通道名称(即在您的应用中的Processor中定义)。

我认为这很可能会变得更容易或更自动化,但在Spring Cloud中需要做一些工程设计工作。 github中有一个问题,如果你想遵循它:https://github.com/spring-cloud/spring-cloud-stream/issues/156

要手动向Spring云流发送消息,您可以手动设置标题(但它更容易使用流)。 JSON消息在Rabbit管理界面中看起来像这样:

priority: 0 
delivery_mode: 2 
headers:  
    contentType: text/plain 
    originalContentType: application/json 
content_type: text/plain 
+0

我可以配置NOT_NULL序列化吗? – waste

+0

你可以用你喜欢的任何方式注释你的DTO。杰克逊会尊重你的意愿,我应该想。你是这个意思吗?它与原始问题有关吗? –

+0

这不是一个对象映射器而不是注释的问题吗? AFAIK使用注释为了过滤空值已被弃用,你应该通过映射器配置。因此,我认为这是问题的一部分。作为配置序列化策略的一部分,您应该能够以某种方式提供对象映射器的实例。除非我错了。 – waste

相关问题