117.5. Operator 支持
解析器仅限于只支持单个 Operator。
要启用它,必须将左侧值包括在 $\\{ } 中。语法为:
${leftValue} OP rightValue
其中 rightValue
可以是以 ' '
、null
、一个恒定值或其他包括在 $\{ }
中的其他表达式的字符串。
运算符 必须 有空格。
Camel 将自动将 rightValue 类型转换为 leftValue 类型,例如它可以将一个字符串转换为一个数字,因此可以使用 >
来比较数字值。
支持以下 Operator:
Operator | 描述 |
---|---|
== | 等于 |
=~ | 等于忽略大小(在比较 String 值时忽略大小写) |
> | 大于 |
>= | 大于 or equals |
< | 小于 |
⇐ | 小于 or equals |
!= | not equals |
!=~ | 不等于忽略大小(在比较 String 值时忽略大小写) |
contains | 如果包含基于字符串的值,则用于测试 |
!contains | 如果基于字符串的值中没有包含测试 |
~~ | 在基于字符串的值中忽略大小敏感度,则用于测试 |
!~~ | 在基于字符串的值中忽略问题单敏感度,则用于测试 |
regex | 对于与给定的正则表达式模式匹配,定义为 String 值 |
!regex | 对于 不与作为 String 值定义的给定正则表达式模式匹配 |
in | 要在一组值中匹配,每个元素必须用逗号分开。如果要包含空值,则必须使用双逗号(如 ',bronze,silver,gold' )定义它,它是一组带有空值的四个值,然后是三个形形。 |
!in | 若要匹配(如果没有在一组值中),则必须用逗号分隔每个元素。如果要包含空值,则必须使用双逗号(如 ',bronze,silver,gold' )定义它,它是一组带有空值的四个值,然后是三个形形。 |
is | 如果左侧 type 是值的实例,则进行匹配。 |
!is | 如果左侧类型不是值的实例,则进行匹配。 |
range |
如果左手位于定义为数字( |
!range |
如果左手不在定义为数字( |
startsWith | 测试左侧字符串是否以右手字符串开头。 |
从开始 | 与 startsWith 运算符相同。 |
endwith | 用于测试左侧字符串是否以右手字符串结尾。 |
结束 | 与 endWith 运算符相同。 |
也可以使用以下元运算符:
Operator | 描述 |
---|---|
++ | 要按数字递增,请执行以下操作:左侧必须是函数,否则解析为 literal。 |
— | 要减少一个数字,请执行以下操作:左侧必须是函数,否则解析为 literal。 |
\n | 使用换行符。 |
\t | 使用制表符。 |
\r | 使用 carriage 返回字符。 |
\} | 要将 } 字符用作文本。使用简单语言构建 JSon 结构时需要这样做。 |
以下逻辑运算符可用于对表达式进行分组:
Operator | 描述 |
---|---|
&& | logical 和 运算符用于对两个表达式进行分组。 |
logical or 运算符用于对两个表达式进行分组。 |
AND 的语法是:
${leftValue} OP rightValue && ${leftValue} OP rightValue
OR 的语法是:
${leftValue} OP rightValue || ${leftValue} OP rightValue
一些示例:
// exact equals match simple("${header.foo} == 'foo'") // ignore case when comparing, so if the header has value FOO this will match simple("${header.foo} =~ 'foo'") // here Camel will type convert '100' into the type of header.bar and if it is an Integer '100' will also be converter to an Integer simple("${header.bar} == '100'") simple("${header.bar} == 100") // 100 will be converter to the type of header.bar so we can do > comparison simple("${header.bar} > 100")
117.5.1. 与不同类型的比较
当您与不同类型(如 String 和 int )进行比较时,您必须小心。Camel 将使用左侧的类型作为 1 个优先级。如果这两个值都无法根据该类型进行比较,并回退到右侧类型。
这意味着您可以利用值来强制执行特定类型的类型。假设上面的 bar 值是一个 String。然后您可以重新利用它:
simple("100 < ${header.bar}")
然后,确保 int 类型被用作 1st 优先级。
如果 Camel 团队将二进制比较操作改进,以基于 String 的首选数字类型,则这可能会改变。最常见的 String 类型会导致与数字比较时出现问题。
// testing for null simple("${header.baz} == null") // testing for not null simple("${header.baz} != null")
另一个更高级的示例,其中右值是另一个表达式
simple("${header.date} == ${date:now:yyyyMMdd}") simple("${header.type} == ${bean:orderService?method=getOrderType}")
另一个包含的示例,测试标题是否包含 Camel 一词
simple("${header.title} contains 'Camel'")
另外,带有 regex 的示例,测试数字标头是否为 4 位值:
simple("${header.number} regex '\\d{4}'")
最后是一个示例,如果标头等于列表中的任何值。每个元素必须用逗号分开,且不能空格分开。
这也适用于数字,因为 Camel 会将每个元素转换为左侧的类型。
simple("${header.type} in 'gold,silver'")
对于最后的 3,我们也支持使用 negate 测试:
simple("${header.type} !in 'gold,silver'")
您可以测试类型是否是一个特定实例,例如字符串
simple("${header.type} is 'java.lang.String'")
我们为所有 java.lang
类型添加了一个简写,以便您可以将其写入:
simple("${header.type} is 'String'")
也支持范围。范围间隔需要数字,以及 from 和 end 都包括。例如,要测试值介于 100 到 199 之间:
simple("${header.number} range 100..199")
请注意,我们在没有空格的范围内使用 ..
。它基于与 Groovy 相同的语法。
simple("${header.number} range '100..199'")
因为 XML DSL 没有所有具有其各种构建器方法的 Java DSL 电源,所以您必须利用其他语言通过简单运算符进行测试。现在,您可以使用简单的语言进行此操作。在以下示例中,我们需要测试标头是否为小部件顺序:
<from uri="seda:orders"> <filter> <simple>${header.type} == 'widget'</simple> <to uri="bean:orderService?method=handleWidget"/> </filter> </from>
117.5.2. 使用 和 / 或
如果您有两个表达式,您可以将它们与 &
amp;& 或 ||
运算符合并。
例如:
simple("${header.title} contains 'Camel' && ${header.type'} == 'gold'")
此外,还支持 ||
。这个示例为:
simple("${header.title} contains 'Camel' || ${header.type'} == 'gold'")