Apache camel 当一些使用头的Camel组件区分大小写时,为什么Camel在exchange中将头键从REST DSL转换为小写?

Apache camel 当一些使用头的Camel组件区分大小写时,为什么Camel在exchange中将头键从REST DSL转换为小写?,apache-camel,Apache Camel,我从各种端点源向exchange中获取头,在某些情况下,头是在路由中定义的。只有在我的REST端点的情况下,头键才会转换为小写。我了解到,Camel中的大多数内容在引用头键时都不区分大小写,我知道HTTP规范,例如,这很好,大小写不重要: .process((exchange) -> { exchange.getIn().setHeader("blueMoonNight", "foo"); System.out.println(exchange.getIn().getHea

我从各种端点源向exchange中获取头,在某些情况下,头是在路由中定义的。只有在我的REST端点的情况下,头键才会转换为小写。我了解到,Camel中的大多数内容在引用头键时都不区分大小写,我知道HTTP规范,例如,这很好,大小写不重要:

.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;
declare variable $in.headers.blueMoonNight as xs:string external;
尽管Camel的头在许多情况下是不区分大小写的,但并不是所有组件都使用它;在本例中,使用xQuery组件。不过,在封面下,Camel确实在头键中保留大小写,除非在使用诸如restdsl之类的HTTP时将其转换为小写

例如,如果我向REST DSL发送一条POST,在HTTP头中使用与前面完全相同的“blueMoonNight:foo”,然后调用相同的xQuery组件,则情况正好相反。这个爆炸了:

declare variable $in.headers.bluemoonnight as xs:string external;
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看起来有点难看

我已经尝试过仅在我的REST路由中“重置”标题,方法是执行以下操作,以使我的所有入口点的情况保持一致:

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

虽然骆驼不会抱怨,但它不起作用。似乎一旦定义了标题,情况就保持不变了!任何建议的解决方法?

Camel将头存储在此映射实现中

正如您可以看到的,它的JDK树映射具有不敏感的顺序

所以我怀疑它的xquery或其他库不能正确处理树映射的这种不敏感的顺序

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


另一种选择是在最新的Camel 2.20中,您可以通过新的
HeadersMapFactory
()配置不同的头映射,您可以使用常规的非不敏感HashMap等,或者尝试新的Camel-headersmap组件,您可以将其放到类路径上,Camel应该自动检测并使用它(如果是,它会记录)它的实现与JDK TreeMap不同,因此可以与xquery一起使用。

您使用的是什么版本的Camel,您使用的是什么rest组件,例如servlet、jetty等。Camel版本2.19.2,通过Camel servlet使用rest DSL,带有Spring Boot的嵌入式Tomcat。我还没有太多时间来浏览xQuery组件的Camel源代码,但我想弄清楚Camel是如何使用xQuery本身引用的声明外部变量绑定交换头、属性等的。显然,您不能仅仅将Saxon指向一个大的树形图,因为变量名在xQuery中是区分大小写的,我的问题的根源实际上是因为Camel Servlet在将HTTP头键放入CaseinInstalleMap之前弄乱了它们的大小写。奇怪的是,在Camel 2.16.5中,代码
exchange.getOut().getHeaders().keySet()
返回区分大小写的标题,因为它不是Camel 2.13.x中的标题。