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 来应用前两个建议之一。
我已经实现了接收多个参数作为查询的端点
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 来应用前两个建议之一。