2016-02-19 89 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

相關問題