无法使用int-http:outbound-gateway

时间:2016-10-08 13:30:10

标签: spring-integration content-type

我有一个http:inbound-gateway,接收一条json消息,进行一些扩充并使用http:outbound-gateway将其发送到端点,以便使用json payload调用rest服务。

Inbound-gw接收内容类型标头,它在邮件头上设置,但是当使用outbound-gw将有效负载发送到其他服务时,会发生以下错误: 415不支持的媒体类型

我检查了日志,显示以下警告:

WARN DefaultHttpHeaderMapper:951 - 不会设置带有'application / json'值的标题'content-type',因为它不是String而且没有可用的Converter。考虑使用ConversionService注册转换器(例如)

这很奇怪,因为content-type标头设置为值application / json,我使用mapped-request-headers =“HTTP_REQUEST_HEADERS”。我正在使用SI 4.3.1.RELEASE,任何想法?

这是http:inbound-gw

<int-http:inbound-gateway id="restHttpInboundGateway"
        request-channel="restHttpInboundChannel" path="/services"
        supported-methods="GET,POST,PUT,DELETE,PATCH,HEAD"
        reply-channel="restHttpOutboundChannel" 
        mapped-request-headers="http_requestMethod,Content-Length,Accept,Connection, Content-Type">
        <int-http:request-mapping consumes="application/json,application/xml"
            produces="application/json,application/xml" />
    </int-http:inbound-gateway>

这是outbound-gw

<int-http:outbound-gateway id="restHttpOutboundGateway"
        request-channel="restHttpOutboundGatewayChannel" reply-channel="restHttpOutboundChannel"
        url-expression="https://localhost:8443/service/rest/contacts/1" mapped-request-headers="HTTP_REQUEST_HEADERS"
        http-method-expression="PUT" expected-response-type="java.lang.String"
        charset="UTF-8"/>

这是在outbound-gw之前记录的消息:

2016-10-08 10:07:04,634 INFO serviceMessages:194 - GenericMessage [payload = byte [76],headers = {content-length = 76,replyChannel = org.springframework.messaging.core.GenericMessagingTemplate $ TemporaryReplyChannel @ 44237f19,errorChannel = org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel@44237f19,content-type = application / json,connection = keep-alive,id = 79012bea-263b-0f48-6e96-5fc832c08da6,accept = [text / plain , / ],timestamp = 1475932024630}]

2 个答案:

答案 0 :(得分:2)

这看起来像一个bug;标头映射器应始终在Spring Integration消息中将Content-Type映射到contentType。出站适配器期待contentType

但是,在入站端执行此操作的代码正在查找Content-Type(区分大小写)并从Spring MVC获取content-type。也许有些事情发生了变化。

看起来我们需要使这个映射测试不区分大小写。

与此同时,您可以添加标题扩充器来复制标题...

<header-enricher ...>
    <header name="contentType" expression="headers['content-type']" />
</header-enricher>

以及用于删除content-type标头的标头过滤器(以消除警告日志)。

答案 1 :(得分:0)

DefaultHttpHeaderMapper中还有另一个错误,当ConversionService未提供错误时,MimeType标题的content-type无法转换为字符串

您可以为DefaultHttpHeaderMapper.outboundMapper()创建mapped-request-headers bean而不是<int-http:outbound-gateway>。或者,再次:将content-type重新映射到自身:

<header name="content-type" expression="headers['content-type'].toString()" override="true"/>