我从各种端点源获取标题到我的交换中,并且在某些情况下在路由中定义。仅在我的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并不抱怨,但它并不起作用。似乎一旦标题定义,案例保持不变!任何建议的解决方法?
答案 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一起使用。