从 http 编组 xml 到 json 后,Apache Camel 编码错误

Apache Camel wrong encoding after marshalling xml to json from http

我正在执行 http 调用以从拉丁美洲的 newspaper xml feed 获取 RSS 提要,然后将响应 body 转换为 JSON。 拉丁美洲报纸的问题是报纸经常发现需要编码的拉丁字符,例如 á é í ó ú.

问题是响应编码不正确,所以我得到这样的描述: Las lluvias llegar��an a la ciudad de C��rdoba jueves y viernes seg��n prev�� el Servicio Meteorol��gico Nacional (SMN)

我已经尝试为 http 组件和 xmljson marshal 设置编码参数,但两者都不起作用。我还尝试为 application/rss+xml; charset=utf-8application/json; charset=utf-8 强制 Content-Type headers 但两者都没有。

我正在使用以下数据格式:

<dataFormats>
  <xmljson id="xmljson"/>
</dataFormats>

而我的路线如下:

<route id="rss">
    <from uri="direct:rss"/>
    <setHeader headerName="CamelHttpUri">
        <simple>"http://srvc.lavoz.com.ar/rss.xml"</simple>
    </setHeader>
    <setHeader headerName="CamelHttpMethod">
        <constant>GET</constant>
    </setHeader>
    <to uri="http://rss"/>
    <marshal ref="xmljson"/>
</route>

一个示例响应是:

{
    "channel": {
    "title": "LaVoz",
    "link": "http://srvc.lavoz.com.ar/rss.xml",
    "description": [],
    "language": "en",
    "item": [
      {
        "title": "��Se vienen las lluvias a C��rdoba?",
        "link": "http://srvc.lavoz.com.ar/ciudadanos/se-vienen-las-lluvias-cordoba",
        "description": "Las lluvias llegar��an a la ciudad de C��rdoba jueves y viernes seg��n prev�� el Servicio Meteorol��gico Nacional (SMN) aunque se mantendr�� el promedio de las temperaturas.�� Este martes estuvo cielo algo nublado con una temperatura m��nima de 14�� registrada a las 6.10 y una m��xima de 29,5�� a las 15.30, seg��n indic�� el Observatorio Meteorol��gico C��rdoba.�� Pron��stico extendido Hay probabilidad de tormentas para jueves y viernes. Mir�� el pron��stico.�� Ciudadanos",
        "pubDate": "Tue, 14 Feb 2017 21:19:21 +0000",
        "dc:creator": {
          "@xmlns:dc": "http://purl.org/dc/elements/1.1/",
          "#text": "redaccionlavoz"
        },
        "guid": {
          "@isPermaLink": "false",
          "#text": "1099119 at http://srvc.lavoz.com.ar"
        }
    },...

更新:
- 如果路由 returns XML 响应(没有将其编组到 JSON)编码按预期工作。
- 如果不是编组路由,而是将 body 内容和 XML 响应记录到记录器中,问题也会出现。

一位朋友在编组之前使用 UTF-8 将正文 convertBodyTo 转换为字符串,从而解决了这个问题。

结束代码如下所示:

    <route id="rss">
        <from uri="direct:rss"/>
        <setHeader headerName="CamelHttpUri">
            <simple>"http://srvc.lavoz.com.ar/rss.xml"</simple>
        </setHeader>
        <setHeader headerName="CamelHttpMethod">
            <constant>GET</constant>
        </setHeader>
        <to uri="http://rss"/>

        <convertBodyTo type="String" charset="UTF-8" />
        <setProperty propertyName="CamelCharsetName">
        <constant>utf-8</constant>
        </setProperty>

        <marshal ref="xmljson"/>
    </route>