92.4. Operator 支持
解析器仅限于只支持单个 Operator。
要启用它的值必须用 $\\{ } 括起来。语法为:
${leftValue} OP rightValue
其中 rightValue
可以是字符串字面,用 ' '
、null
、一个常量值或其他表达式括起在 $\{ }
中。
Operator 必须具有 空格。
Camel 将自动将 rightValue 类型转换为 leftValue 类型,例如它可以将一个字符串转换为一个数字,因此可以使用 >
来比较数字值。
支持以下 Operator:
Operator | 描述 |
---|---|
== | 等于 |
=~ | 等于忽略问题单(在比较字符串值时忽略问题单) |
> | 大于 |
>= | 大于或等于或等 |
< | 小于 |
⇐ | 小于或等于不相等 |
!= | 不相等 |
!=~ | 不等于忽略问题单(在比较字符串值时忽略问题单) |
contains | 在基于字符串的值中包含测试 |
!tains | 在基于字符串的值中没有包括测试 |
~~ | 在基于字符串的值中忽略问题单敏感度,用于测试 |
!~~ | 在基于字符串的值中忽略问题单敏感度,用于测试 |
regex | 对于定义为字符串值的给定正则表达式模式匹配 |
!regex | 与定义为字符串值的给定正则表达式模式匹配 |
in | 若要在一组值中匹配,每个元素必须以逗号分开。如果要包含空值,则必须使用双逗号(如 ',bronze,silver,gold' )定义它,这是一组带有空值的四个值,然后是三 medals。 |
!in | 要匹配(如果没有在一组值中),则必须使用逗号分隔每个元素。如果要包含空值,则必须使用双逗号(如 ',bronze,silver,gold' )定义它,这是一组带有空值的四个值,然后是三 medals。 |
is | 如果左侧类型是值的实例,则匹配。 |
!is | 如果左侧类型不是值的实例,则匹配。 |
range |
对于匹配,如果左侧的值位于定义为 number: |
!range |
如果左侧的值不在定义为数字的一系列值中,则匹配: |
startsWith | 为了测试左侧字符串是否以右手动字符串开头。 |
从开始 | 与 startWith operator 相同。 |
endsWith | 用于测试左侧字符串是否以右手动字符串结尾。 |
结束 | 与 endWith 运算符相同。 |
以下 unary operator 可用于:
Operator | 描述 |
---|---|
++ | 将数字递增 1。左侧必须是函数,否则被解析为字面。 |
— | 将数字减一。左侧必须是函数,否则被解析为字面。 |
\n | 使用换行符: |
\t | 使用标签字符: |
\r | 使用 carriage 返回字符。 |
\} | 使用 } 字符作为文本。这在使用简单语言构建 JSon 结构时可能需要这样做。 |
以下逻辑运算符可用于对表达式进行分组:
Operator | 描述 |
---|---|
&& | logical 和 运算符用于对两个表达式进行分组。 |
logical 或 运算符用于对两个表达式进行分组。 |
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")
92.4.1. 与不同类型的比较
当您将不同的类型(如 String 和 int )进行比较时,您必须小心。Camel 将把左侧的类型用作第 1 个优先级。如果两个值都不能根据该类型进行比较,则回退到右侧类型。
这意味着您可以修改值来强制实施特定类型的。假设上面的 bar 值是一个 String。然后您可以模糊处理:
simple("100 < ${header.bar}")
然后,这样可确保 int 类型用作 1st 优先级。
如果 Camel 团队改进了二进制比较操作,以首选使用数字类型到字符串,这可能会在以后更改。通常是字符串类型,与数字进行比较时会导致问题。
// 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'")
也支持范围。范围间隔需要数字和结尾。例如,要测试值是否在 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>
92.4.2. 使用和 / 或
如果您有两个表达式,您可以将它们与 &
amp;& 或 ||
运算符合并。
例如:
simple("${header.title} contains 'Camel' && ${header.type'} == 'gold'")
在课程中,还支持 ||
。示例为:
simple("${header.title} contains 'Camel' || ${header.type'} == 'gold'")