使用camel解组:base64返回错误的二进制文件

时间:2015-10-29 16:15:31

标签: base64 apache-camel

我正在使用<base64>元素来解组作为XML一部分的base64代码。路线看起来像这样:

<route>
  <split streaming="true" strategyRef="myAggregationStaregy">
    <xpath>/*/*</xpath>
    <choice>
      <when>
        <xpath>//record</xpath>
        <to uri="file:/record.xml" />
      </when>

      <when>
        <xpath>//content</xpath>

        <unmarshal>
          <base64 />
        </unmarshal>

        <to uri="file:/content.bin" />
      </when>
    </choice>
  </split>
</route>

虽然XML拆分工作正常,但<unmarshal>任务会返回垃圾。结果二进制文件实际上是预期的大小,但字节本身是完全错误的。

尝试:

  • 应用lineSeparatorlineLength选项无效。
  • 当省略路由中的<unmarshal>块并手动转换生成的base64代码(linux base64命令)时,我收到了正确的二进制文件。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

同时我找到了解决方案: 我期望<xpath>//content</xpath>语句过滤传入的XML,以便消息体仅包含content元素内的部分。

但这是错的。这个“xpath”语句是“when”语句的谓词,它根本不进行过滤。

为了实现预期的行为,我必须明确地提取我的XML的“内容”部分并将其写入消息体(使用“setBody”语句)。我的路线最终看起来像这样:

<route>
  <split>
    <xpath>/*/*</xpath>
    <choice>
      <when>
        <xpath>//record</xpath>
        <to uri="file:/record.xml" />
      </when>

      <when>
        <xpath>//content</xpath>

        <setBody><xpath>//content/text()</xpath></setBody>

        <unmarshal>
          <base64 />
        </unmarshal>

        <to uri="file:/content.bin" />
      </when>
    </choice>
  </split>
</route>