【问题标题】:MULE 3.7.0 C.E. - BufferInputStream payload turns into StringMULE 3.7.0 CE - BufferInputStream 有效负载变成字符串
【发布时间】:2018-02-27 07:14:24
【问题描述】:

我们正在编写一个分为几个层次的 MULE REST 服务。

API 层(基于 RAML)接收入站请求并准备一些 flowVar,以便较低层知道如何继续。

第二层也是服务定义的,所以每个服务都有一个流。

最后,第三层包含一个唯一的流,它根据上层配置的flowVars,使用HTTP请求组件对所需的第三方服务进行调用。

在这第三层中,制作了一些审计寄存器,以便了解我们发送和接收的内容。因此,我们的审计组件(一个自定义的 MULE 连接器)需要将有效负载的内容写入我们的数据库,因此需要 message.getPayloadAsString()(或类似的)。如果我们使用一个干净的getter(如message.getPayload()),则只获取数据类型并因此写入数据库。

问题就在这里。接收到的每个有效负载似乎都是一个 BufferInputStream,并且在执行message.getPayloadAsString() 时,内部转换似乎正在影响有效负载。这通常不会成为问题,除了我们发现的一种情况:我们调用的服务之一返回一个 PNG 文件,因此message.getPayloadAsString() 将其转换为字符串并破坏图像。

我们已尝试克隆有效负载以保护其中一个副本免受强制转换,但作为对象,它没有实现 Cloneable 接口;我们尝试以任何其他单一方式复制有效负载,但只生成一个新的引用;我们已经尝试序列化有效负载以从序列化数据创建新副本,但 Object 也没有实现 Serializable 接口......一切都没用。

任何帮助、想法或建议将不胜感激。

【问题讨论】:

  • 感谢@AndrewKoropets 编辑帖子中的格式。我什至没有注意到这是错误的。 :-)

标签: serialization mule png clone payload


【解决方案1】:

我们终于用message.getPayloadAsBytes();解决了这个问题,它的返回值是一个全新的byte[]对象。此方法也不会更改消息中的有效负载。通过使用字节数组,我们可以创建一个 String 对象,像这样写在我们的审计中:

byte[] auditByteArray[] = message.getPayloadAsBytes();
String auditString = new String(auditByteArray);

此外,我们尝试了一项测试,包括将该字节数组稳定为消息中的新负载,并且 JSON 和 PNG 响应均由浏览器正确管理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多