Spring Integration:使用应用程序/八位字节流内容类型的http转换器问题

时间:2019-04-08 22:31:32

标签: spring spring-integration spring-cloud-stream

我有这个流程:

@Bean
public IntegrationFlow flow(){
    return IntegrationFlows.from(QueueMessageSink.INPUT)
        .transform(Transformers.fromJson(QueueMessage.class))
        .<QueueMessage, DTOMessage> transform(queueMessage -> new DTOMessage(/* transform logic */))
        .handle(Http.outboundGateway(uri).httpMethod(HttpMethod.POST))
        .channel("nullChannel")
        .get();
}

基本上,我正在从队列中读取一条消息并将其发布到REST端点。

队列中的消息随Content-type application / octet-stream一起到达,因此我以以下方式配置了队列:

spring.cloud.stream.bindings.my-queue.contentType=application/octet-stream

消息已正确地从JSON转换为QueueMessage以及从QueueMessage转换为DTOMessage,但是在尝试发布DTOMessage时遇到以下异常:

Caused by: org.springframework.messaging.MessageHandlingException: HTTP request execution failed for URI; nested exception is org.springframework.web.client.RestClientException: Could not write request: no suitable HttpMessageConverter found for request type [com.example.DTOMessage] and content type [application/octet-stream]

我认为(也许我错了)Http.outboundGateway正在从Spring Integration Message的标头读取内容类型application / octet-stream。

解决此问题的正确方法是什么?我想可能的解决方案是将内容类型更改为application / json,但是我不确定这是否是最简单的方法(而且我也不知道该怎么做)。

谢谢。

1 个答案:

答案 0 :(得分:1)

  

我想可能的解决方案是将内容类型更改为application / json

这确实是正确的方法,但是您不应该在bindings上这样做,而应该在流程内部进行。我认为类似这样的方法应该可以帮助您解决问题:

.enrichHeaders(h -> h
                .defaultOverwrite(true)
                .header(MessageHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON))
.handle(Http.outboundGateway(uri).httpMethod(HttpMethod.POST))