当前位置: 首页 > 知识库问答 >
问题:

无法使用int-http:outbound-gateway映射内容类型头

车思淼
2023-03-14

我有一个http:inbound-gateway,接收一个json消息,做一些充实,并使用http:outbound-gateway将它发送到一个endpoint,以调用一个同样具有json有效负载的rest服务。

入站gw接收内容类型标头,它设置在消息标头上,但当使用出站gw将有效负载发送到其余服务时,会发生以下错误:415不支持的媒体类型

我检查了日志,出现了以下警告:

WARN DefaultHttpHeaderMapper: 951-不会设置具有值“application/json”的标头“内容类型”,因为它不是字符串并且没有可用的转换器。考虑向ConversionService注册转换器(例如,)

这很奇怪,因为内容类型头设置为值application/json,我使用映射的请求头=“HTTP_request_headers”。我正在使用SI 4.3.1.0版本,你知道吗?

这是

<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>

这是出站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:04634 INFO service messages:194-generic message[payload = byte[76],headers={content-length=76,reply channel = org . spring framework . messaging . core . genericmessaging template $ temporary reply channel @ 44237 f19,error channel = org . spring framework . messaging . core . genericmessaging template $ temporary reply channel @ 44237 f19,content-type

共有2个答案

卢磊
2023-03-14

DefaultHttpHeaderMapper中还有另一个错误,当它没有随ConversionService一起提供时,因此Content-type标头的MimeType无法转换为String。

您可以为创建DefaultHttpHeaderMapper.outboundMapper()bean而不是mapted-estest-Headers

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

苏华藏
2023-03-14

这看起来像一个错误;标头映射器应始终在 Spring 集成消息中将内容类型映射到内容类型。出站适配器需要内容类型

然而,在入站端执行该操作的代码正在寻找< code>Content-Type(区分大小写),并从Spring MVC获取< code>content-type。也许有些事情已经改变了。

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

同时,您可以添加一个标题丰富器来复制标题...

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

和一个头过滤器来删除内容类型头(以消除警告日志)。

 类似资料:
  • 我一直试图仅使用文件内容检测MIME类型,使用Apache Tika Core和Apache Tika Parser1.23 jars。下面是用于相同内容的代码: Tika无法检测扩展名为。tmp(text/plain file)和iso-8859-1字符集的文件的内容类型,内容如下: èé 通过以下方式正确检测具有相同配置和以下内容的文件: 000000000000000000000000000

  • 问题内容: 我正在尝试为作为JSON传入的对象创建内部类类型,但是尽管我在此处以及杰克逊的网站上都读了很多文章,但我似乎无法获得正确的组合,因此,如果其他人有任何指针,他们将不胜感激。我在下面发布了一些代码片段,并删除了所有的getter和setter,但我不认为他们需要发布。我正在使用Jackson 2.2。 我正在尝试反序列化的类: 我用来反序列化的代码: 我的JSON测试数据: 问题答案:

  • 我在解决泛型问题时遇到了一些麻烦。我有一个“猫”对象列表和一个“狗”对象列表,我需要将它们传递到同一个方法中。该方法的返回类型是一个“字符串”和“动物列表”的映射,我试图找出一种方法来将带有动物列表的映射转换为带有猫或狗列表的映射。 这工作很好,如果我有一个单独的方法猫和狗,但我正在寻找一个更灵活的解决方案。 标题中出现错误的行: 注意:这是一个简化的例子,我必须能够使用地图中的列表作为“猫”或“

  • 我有一个泽西1.19.1资源,它实现了和方法。方法需要一个JSON字符串作为输入/请求正文,而方法接受纯文本。对于JSON映射,我使用Jackson 2.8。 由于资源是按这种方式定义的,我不希望客户端需要指定内容类型请求头,因为Jersey需要它来确定在请求体上使用哪个对象映射器。 相反,我想告诉Jersey“将此对象映射器用于此输入”,或者“始终假定此输入将在此方法上具有一个应用程序/json

  • 我正在开发和spring应用程序,对于对象映射,我使用ModelMapper库。 我能够映射基本类映射,但当我尝试映射2个集合元素时,源是一组枚举,具有其他属性,如名称和描述,目标是具有id、名称和描述的pojo。 我已经尝试了类型地图和转换器在映射配置文件,但我得到例外的映射器。 源类来自其他应用程序(其依赖项已在pom.xml中添加)。我也不希望源类型作为目标setter中的参数。 前。 资料

  • 我试图通过使用多个测试数据在Cucumber DataTable中使用映射来自动化一个场景。在本测试中,我们将向测试步骤传递两次Username和Password。所以我们的测试应该输入用户名和密码一次,点击登录按钮,并重复相同的步骤再次。 我已经尝试使用for循环来使用Maps集合重复测试。1.我收到一个错误,表示类型不匹配:无法从元素类型2。当我将其转换为时,我得到另一个错误,说明方法send