我有一个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}]
答案 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"/>