当使用标头的某些Camel组件区分大小写时,为什么Camel会将标头密钥从REST DSL转换为小写在交换中?

时间:2017-10-13 20:35:46

标签: apache-camel

我从各种端点源获取标题到我的交换中,并且在某些情况下在路由中定义。仅在我的REST端点的情况下,标题键被转换为小写。我知道Camel中的大多数内容在引用标题密钥时不区分大小写,并且我知道HTTP规范,例如这种方法很好并且大小写并不重要:< / p>

.process((exchange) -> {
    exchange.getIn().setHeader("blueMoonNight", "foo");
    System.out.println(exchange.getIn().getHeader("blueMoonNight"));
    System.out.println(exchange.getIn().getHeader("bluemoonnight"));

    })

一切都很好。现在,如果我接下来使用xquery组件,这将在我的xquery中运行:

declare variable $in.headers.blueMoonNight as xs:string external;

但这会爆发:

declare variable $in.headers.bluemoonnight as xs:string external;

虽然Camel的标题在许多情况下都不区分大小写,但并不是所有组件都是如此;在这种情况下是xQuery组件。尽管如此,Camel确实保留了标题键中的大小写,除非使用REST DSL之类的东西,它将它转换为小写。

例如,如果我向REST DSL发送一个完全相同的&#34; blueMoonNight:foo&#34;和之前在HTTP头中一样,后来调用相同的xQuery组件,反之亦然。爆炸了:

declare variable $in.headers.blueMoonNight as xs:string external;

但这很好用:

declare variable $in.headers.bluemoonnight as xs:string external;

当我在路由中有许多REST和JMS入口点时,这种不一致性给我带来了一些痛苦,并且根据最初提供的头文件有条件地在我的路由中设置了一些新头,然后使用一个挑剔的Camel组件像xQuery这样的关键案例。另外必须使用$ in.headers.myprettylongexternalvariable看起来有点难看。

我试过&#34;重置&#34;通过执行类似的操作,只在我的REST路由中标题,以使我的所有入口点都保持一致:

.setHeader("blueMoon", simple("${header.blueMoon}"))

尽管Camel并不抱怨​​,但它并不起作用。似乎一旦标题定义,案例保持不变!任何建议的解决方法?

1 个答案:

答案 0 :(得分:0)

Camel将标题存储在此地图实现中

正如您可以看到它的JDK TreeMap具有不敏感的排序。

所以我怀疑它的xquery或其他库没有正确处理该TreeMap的这种不敏感的排序。

您可以尝试深入了解xquery(saxon)如何做到这一点,并在他们的用户论坛等上询问。

另一种选择是在最新的Camel 2.20中,您可以通过新的 Company.first.disclosures.to_a.uniq(&:pdf_sha256) https://github.com/apache/camel/blob/master/camel-core/src/main/java/org/apache/camel/spi/HeadersMapFactory.java)配置不同的标题映射,您可以使用常规的非敏感HashMap等,或尝试使用新的驼峰-headersmap组件,您可以放在类路径上,Camel应该自动检测并使用它(如果是这样,它会记录)它具有与JDK TreeMap不同的实现,因此它可以与xquery一起使用。