Apache Camel Split - 仅提供一个 header 时错误地拆分 header

Apache Camel Split - splitting header incorrectly when only one header is provided

我已经实现了接收多个参数作为查询的端点

i.e: /flights?flight=AB,100,12FEB18&flight=CD,200,13FEB18&flight=...&...

在骆驼中我想拆分每个飞行参数并单独处理,所以我有:

.split(header("flight"))

案例一

Query: /flights?flight=AB,100,24FEB18&flight=AB,200,25FEB18

分成:
1) AB, 100, 24FEB18
2) AB, 200, 25FEB18

结果:正确

案例二

Query: /flights?flight=AB&flight=AB,100&flight=AB,200,26FEB18

分成:
1) AB
2) AB, 100
3) AB, 200, 26FEB18

结果:正确

案例三

Query: /flights?flight=AB,400,28FEB18

分成:
1) AB
2) 400
3) 28FEB18

结果:不正确

预期:
1) AB, 400, 28FEB18

为什么一个 header 的分离器工作方式不同,我该如何解决?

好吧,我猜 Camel 是 "too smart" 适用于您的用例,因此您会得到不同的行为。

情况1和2是列表的列表flight 个参数的列表,每个参数都包含 comma-separated 个值的列表。

情况 3 是一个简单的列表。包含 comma-separated 值列表的单个 flight 参数。

因为拆分器想要拆分东西,它在情况 3 中使用 "inner" 列表,而它使用 "outer" 列表在案例 1 和案例 2 中。

要解决此问题,您可以尝试以下几种方法:

  • 更改内部列表的分隔符(例如使用 - 而不是 ,),这样 Camel 就不会认为您的 flight 参数包含案例 3 中的列表。
  • 在案例 3 中添加一个 flight 参数,该参数为空或包含虚拟值,这样您 总有一个 "outer" 列表
    • 在splitter之前使用一个bean,通过splitter
    • 将参数转换成不是mis-interpreted的结构

如果您无法控制 URI 参数,则可以使用 bean 来应用前两个建议之一。