【问题标题】:mule esb outbound https invalid content-typemule esb outbound https 无效的内容类型
【发布时间】:2014-11-13 09:45:22
【问题描述】:

我正在使用 Mule 3.4.0 并且正在创建一个流程,该流程使用 HTTPS 出站端点调用 JIRA 服务器上的一些 RESTful API 端点。我遇到了问题,因为 Mule 出于某种原因发送了导致 JIRA 异常的 Content-Type 标头值。从 JIRA 堆栈跟踪来看,Mule 正在发送以下内容:

应用程序/json, 应用程序/json;charset=UTF-8

JIRA 正在使用 Jersey 并且 Jersey 无法解析该 Content-Type 值。以下是 JIRA 返回的堆栈跟踪的一部分:

原因:java.lang.IllegalArgumentException:解析媒体类型时出错'application/json, application/json;charset=UTF-8' 在 com.sun.jersey.core.impl.provider.header.MediaTypeProvider.fromString(MediaTypeProvider.java:79) 在 com.sun.jersey.core.impl.provider.header.MediaTypeProvider.fromString(MediaTypeProvider.java:53) 在 javax.ws.rs.core.MediaType.valueOf(MediaType.java:119) 在 com.sun.jersey.server.impl.model.HttpHelper.getContentType(HttpHelper.java:89) ... 157 更多 引起:java.text.ParseException:预期的分隔符 ';'而不是 ',' 在 com.sun.jersey.core.header.reader.HttpHeaderReader.nextSeparator(HttpHeaderReader.java:117) 在 com.sun.jersey.core.header.reader.HttpHeaderReader.readParameters(HttpHeaderReader.java:239) 在 com.sun.jersey.core.impl.provider.header.MediaTypeProvider.valueOf(MediaTypeProvider.java:97) 在 com.sun.jersey.core.impl.provider.header.MediaTypeProvider.fromString(MediaTypeProvider.java:77)

我希望能够强制发送特定的 Content-Type 值,但我不知道该怎么做。似乎 Mule 会根据多种因素自动构建 Content-Type 值:

http://www.mulesoft.org/documentation/display/current/HTTP+Transport+Reference

如果端点明确设置了编码,则使用它 否则,从消息的属性 Content-Type 中获取 如果这些都没有设置,请使用 Mule Context 的默认配置。 对于 Content-Type,发送消息的属性 Content-Type,但要设置实际的编码。

所以我认为它使用的是入站属性 Content-Type,但由于这是一个入站属性,我认为我不能在流程中修改/删除它。我修改/删除 Content-Type 属性的尝试无效。我只能修改/删除出站 Content-Type 属性,这似乎对我的出站 HTTP 请求没有帮助。

任何有关如何控制 Content-Type 值或修复它的信息,我们将不胜感激。

【问题讨论】:

  • 什么类型的payload接收服务? (xml 或 json)。您可以设置内容类型,例如: 显示帮助流。
  • 感谢您的提问。我的流程设置有点复杂。我将进行一项 cron 作业,该作业使用 HTTP 入站端点访问流。此流将生成将发布到出站 VM 端点的事件。第二个流程具有入站 VM 端点来接收事件,第二个流程是使用 HTTPS 出站端点向 JIRA 的 API 发送 POST 的流程。如果我在 HTTPS 出站端点之前设置 Content-Type 属性,是否会导致该 Content-Type 值成为请求使用的值?我想我试过了,但没用,但我可以再试一次。
  • 这个错误通常发生在Content-Type无效的时候。我推荐使用 POSTMAN Rest Client 来验证 REST 服务。
  • 我找到了解决方案,但我仍然不明白为什么会出现问题。请看下面我的回答。感谢您的 cmets。

标签: java http mule esb


【解决方案1】:

我花了更多时间使用调试和断点,发现在第一个 HTTPS 出站端点之后,“Content-Type”变量不是入站或出站property) 被设置为“application/json”。我不知道为什么会这样。我在文档中没有看到任何关于 HTTP 传输或 HTTP 端点的内容。如果有人能指出有关那里发生的事情的文档,那就太好了。

作为实验,在我的下一个 HTTPS 出站端点之前,我添加了一个变量转换器来删除“Content-Type”变量。这解决了问题!

因此,Mule 似乎出于某种原因将“Content-Type”变量与我在 HTTP 出站端点中指定的 Content-Type 值相结合,导致“application/json,应用程序/json; charset=UTF-8".

我不得不把它放在每个 HTTPS 出站端点之后以继续删除变量:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    相关资源
    最近更新 更多