骡子 3.7.0 C.E。 - BufferInputStream 负载变成字符串

MULE 3.7.0 C.E. - BufferInputStream payload turns into String

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

API 层(基于 RAML)接收入站请求并准备一些 flowVar,以便下层知道如何进行。

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

最后,第三层包含了一个唯一的flow,就是根据上层配置的flowVars,使用HTTP Request组件调用需要的第三方服务

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

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

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

如有任何帮助、想法或建议,我们将不胜感激。

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

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

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