2017-10-13 26 views
0

我从各种终端来源获取头文件,并在某些情况下在路由中定义。只有在我的REST端点的情况下,标题键才会转换为小写。我得到骆驼最东西指标题密钥时,不区分大小写,我知道的HTTP规范的,例如这工作得很好,不区分大小写:为什么在使用标头的某些Camel组件区分大小写时,Camel会将来自REST DSL的标题密钥转换为小写字母?

.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; 

虽然骆驼的头是情况下,在许多情况下使用不敏感,对不符合所有组件;在这种情况下是xQuery组件。尽管如此,Camel在标题关键字中保留大小写,除非使用诸如REST DSL之类的HTTP方式将其转换为小写字母。例如,如果我发送一个POST到REST DSL,并且在HTTP标头中使用与之前完全相同的“blueMoonNight:foo”,稍后调用相同的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看起来有点难看。

我已经做这样的尝试只在我的休息路线“复位”头让我的所有入口点一致的情况下:

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

虽然骆驼不抱怨,这不是”工作。看起来一旦标题被定义,情况保持不变!任何建议的解决方法?

+0

你使用的是什么版本的骆驼,以及你使用的是什么其他组件,例如servlet,jetty等。 –

+0

骆驼版本2.19.2带有REST DSL over Camel-Servlet,带有Spring-Boot的嵌入式Tomcat。 –

回答

0

骆驼店头在此地图实现

正如你可以看到它的JDK TreeMap中与不敏感的排序。

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

您可以尝试潜入的XQuery(撒克逊)请问是怎么了,请问他们的用户论坛等

另一种方法是在最新的骆驼2。20在这里你可以配置不同的头信息图,通过新的HeadersMapFactoryhttps://github.com/apache/camel/blob/master/camel-core/src/main/java/org/apache/camel/spi/HeadersMapFactory.java)你可以在其中使用常规的非敏感HashMap等,或者尝试新的camel-headersmap组件,你可以放在类路径上,骆驼应该自动检测并使用它(如果是这样的话,它会记录它),它具有与JDK TreeMap不同的实现,所以它可以与xquery协同工作。

+0

我还没有多少时间去浏览xQuery组件的Camel源代码,但我想知道Camel如何绑定xquery中引用的声明外部变量的交换头,属性等。很显然,你不能只将Saxon指向一个大的TreeMap,因为变量名称在xQuery中是区分大小写的,我的问题的根源在于将Camel-Servlet与我的HTTP标题关键字混合在一起,然后再将它们放入CaseInsenstiveMap中。 –

相关问题