【问题标题】:Why won't Mule properly parse XML returned from a webservice?为什么 Mule 不能正确解析从 web 服务返回的 XML?
【发布时间】:2018-04-12 21:19:46
【问题描述】:

我对此有点陌生,但我遇到的问题必须有一个我不知道的直接解决方案。

我正在使用 HTTP 连接器调用 Web 服务,并且该 Web 服务返回有效的 XML。然后我不能自动返回未修改的 XML,否则我会得到

No serializer found for class org.glassfish.grizzly.utils.BufferInputStream and no properties discovered to create BeanSerializer

所以我猜这是因为响应是流式传输的,我需要先对 [whatever] 执行 Byte Array。但是,当我这样做时,引号和换行符会像这样转义

"<?xml version=\"1.0\"?>\r\n<root xmlns=\"http://xmlns.whatever.com"><PERSON type=\"staff\"><ID><![CDATA[00100762]]></ID></PERSON></root>"

如果我尝试使用转换器将其转换为纯字符串、xml、json 或其他任何内容,我最终会得到所有这些转义字符。如果我转换成一个字符串,我将在双引号内得到整个有效负载,如上所示。如果我将其转换为 XML,我最终会得到一个包含转义 XML 字符串的元素。

我已经编写了一个 node.js 小应用程序,它也使用这个 web 服务,它能够毫无问题地解析响应,那么与 Mule 有什么关系呢?调用网络服务并获得我可以解析的响应应该是最基本的事情,我无法让它工作。

【问题讨论】:

    标签: xml mule mule-component anypoint-studio


    【解决方案1】:

    此行为提示我未设置有效负载的 mime 类型。 Mule 转换器使用它来解析任何传入的格式。

    有一个bug in mule 3.8.4(在 3.8.5 及更高版本中已修复)不是从内容类型响应标头设置的。一个简单的解决方法是在 http 请求之后立即在 set payload 消息处理器中显式设置 mime-type:

    <set-payload value="#[payload]" doc:name="Set Payload" mimeType="application/xml"/>
    

    这有望带来更多预期的行为。


    编辑:阅读您的回复后,我现在怀疑上游服务实际上将 xml 作为 json 字符串返回。所以我会尝试将其从 json 转换为 xml 的 java 字符串。

     <json:json-to-object-transformer returnClass="java.lang.String" doc:name="JSON to Object" mimeType="application/xml"/>
    

    【讨论】:

    • 感谢您的回复,这让我发疯了。您的建议无效,但我确实注意到,无论我做什么,如何转换有效负载或设置 mime 类型,mule 返回的有效负载始终具有内容类型 text/json。这也许可以解释引号和新行的转义,因为 json 需要它。我可以在调试器中看到来自 web 服务的响应的内容类型为 text/xml,所以我看不出 mule 会感到困惑。这没有任何意义。
    【解决方案2】:

    在 mule HTTP 请求中返回一个流响应。因此,您需要使用字节数组将其转换为字符串。然后,您可以根据需要使用该字符串转换 xml 或 json。

    【讨论】:

    • 是的,试过了。字节数组到字符串的结果是我原来的帖子中显示的字符串。
    【解决方案3】:

    好吧,我不知道为什么会这样,但我更新到 Mule ESB 4.1 后就没有问题了。

    【讨论】:

      猜你喜欢
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多