当前位置: 首页 > 知识库问答 >
问题:

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

唐沈义
2023-03-14

我从各种endpoint源向exchange中获取头,在某些情况下,头是在路由中定义的。只有在我的RESTendpoint的情况下,头键才会被转换为小写。我了解到,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;

尽管Camel的头在很多情况下是不区分大小写的,但并不是所有组件都支持Camel的头;在本例中,是xQuery组件。不过,在封面下,Camel确实会在头键中保留大小写,除非在使用REST DSL之类的HTTP时将其转换为小写。

例如,如果我向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入口点进入一个路由,并根据最初提供的标题有条件地在我的路由中设置一些新的标题,然后使用一个对标题键情况挑剔的骆驼组件,比如xQuery。另外,不得不使用$in.headers.myprettylongexternalvariable看起来有点难看。

我尝试过只在我的REST路由中“重置”标题,方法是做这样的事情,以使我所有的入口点的情况保持一致:

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

虽然骆驼不会抱怨,但它不起作用。似乎一旦定义了标题,情况就不会变!有什么解决办法吗?

共有1个答案

公英哲
2023-03-14

Camel在此地图实现中存储标头

  • https://github.com/apache/camel/blob/master/camel-core/src/main/java/org/apache/camel/util/CaseInsensitiveMap.java

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

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

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

另一种选择是在最新的Camel 2.20中,通过新的HeadersMapFactory(https://github.com/apache/camel/blob/master/camel-core/src/main/java/org/apache/camel/spi/HeadersMapFactory.java)如果您可以使用常规的非不敏感HashMap等,或者尝试新的camel-headersmap组件,您可以将其放在类路径上,camel应该自动检测并使用它(如果是,它会记录日志),它的实现与JDK树映射不同,因此可以与xquery一起使用。

 类似资料:
  • 在Java中如何将snake case转换为camel case? 输入:“输入蛇的情况” 输出:"InputInSnakeCase"

  • 我有一个带有Camel处理器的骆驼DSL路由,该处理器确定要发送文件的位置。路径保存到Exchange中的标头中,以便将其传递回路由。我想在我的路由中使用此标头值(路径),但我收到以下错误: “不允许使用${}占位符的动态表达式。请使用文件名选项设置动态表达式。” 当我使用fileName选项时,这会创建一个文件作为路径中的最后一个目录,而我希望这是一个目录,但没有像directoryName这样

  • 问题内容: 我想将字符串的第一个字符转换为大写,并将其余字符转换为小写。我该怎么做? 例: 问题答案: 尝试以下尺寸: 基本上,它首先处理空字符串和一个字符字符串的特殊情况,否则正确处理一个两字符以上的字符串。而且,正如评论中指出的那样,功能不需要使用一个字符的特殊情况,但我仍然希望明确,特别是如果它导致更少的无用调用(例如子字符串以获取空字符串),小写字母它,然后附加它。

  • 问题内容: 给定此目录树: 编译file.cpp与VS一起使用,在gcc中失败。 标准怎么说? 如果路径区分大小写,这为什么明智? 最佳实践是什么,将所有文件/文件夹名都小写,并在包含时做同样的事情? 谢谢。 问题答案: 区分大小写取决于操作系统。Windows不区分大小写。Linux是。 编辑: 实际上,正如MartinYork的评论所观察到的,区分大小写取决于文件系统。默认情况下,Window

  • 我有关于在JTextField打字的问题。我的程序搜索通过几个csv文件和寻找指定的JTextField字符串。我有添加到readLine函数". toLowerCase"读取所有字符串作为小写。在写入JTextField时,是否可以将JTextField设置为自动将大写转换为小写? if(line.toLowerCase()。包含(searchedString))

  • 问题内容: 我有一个PHP代码库,用于混合环境下处理我们的MySQL表。例如,。 我们的代码也可以在Windows上运行,并且在不了解之前,我们已经将多个数据库导入到Windows服务器上。这导致Windows MySQL将所有表名更改为小写。()。现在,我们知道如何防止这种情况发生在新数据库中。()并且,代码在Windows服务器上运行良好,因为MySQL根本不在乎Windows上表的大小写。