124.5. Operator 支持
解析器仅限于只支持单个操作器。
要启用它,左侧值必须包括在 $\\{ } 中。语法是:
${leftValue} OP rightValue
${leftValue} OP rightValue
其中 rightValue 可以是以 ' '、null、恒定值或以 $\{ } 括起的另一个表达式的 String 文字。
Operator 必须 有空格。
Camel 将自动将 rightValue 类型转换为 leftValue 类型,例如它可以将一个字符串转换为一个数字,因此可以使用 > 来比较数字值。
支持以下 Operator:
| Operator | 描述 |
|---|---|
| == | 等于 |
| =~ | 等于忽略条件(在比较字符串值时,将忽略大小写) |
| > | 大于 |
| >= | 大于或等于 |
| < | 小于 |
| ⇐ | 小于或等于 |
| != | 不等于 |
| !=~ | 不等于忽略条件(在比较字符串值时,将忽略大小写) |
| contains | 用于测试,如果基于字符串的值中包含 |
| !contains | 对于测试,如果没有包含在基于字符串的值中 |
| ~~ | 对于测试,通过在基于字符串的值中忽略问题单敏感度来进行测试 |
| !~~ | 对于测试,如果没有在基于字符串的值中忽略问题单敏感度来进行测试 |
| regex | 针对定义为 String 值的正则表达式模式匹配 |
| !regex | 对于不与作为 String 值定义的给定正则表达式模式匹配 |
| in | 要在一组值中匹配,则每个元素必须以逗号分隔。如果要包含空值,则必须使用双逗号定义,例如 ',bronze,silver,gold',它是一个带有空值的四个值,然后是三个 medals。 |
| !in | 要在一组值中没有匹配,则每个元素必须以逗号分隔。如果要包含空值,则必须使用双逗号定义,例如 ',bronze,silver,gold',它是一个带有空值的四个值,然后是三个 medals。 |
| is | 如果左侧类型是值的实例,用于匹配。 |
| !is | 如果左侧类型不是值的实例,用于匹配。 |
| range |
若要匹配,如果左侧位于定义为数字范围: |
| !range |
如果左侧的值不在定义为数字范围: |
| startsWith | 用于测试左侧字符串是否以右手字符串开头。 |
| 从开始 | 与 startWith 运算符相同。 |
| endsWith | 用于测试左侧字符串以右手字符串结尾。 |
| 结束 | 与 endWith 运算符相同。 |
以下 unary operator 可以使用:
| Operator | 描述 |
|---|---|
| ++ | 将数字递增一。左侧必须是函数,否则作为文字解析。 |
| — | 将数字减少 1。左侧必须是函数,否则作为文字解析。 |
| \n | 使用换行符。 |
| \t | 使用选项卡字符。 |
| \r | 使用回车符。 |
| \} | 将 } 字符用作文本。使用简单语言构建 JSon 结构时,这可能需要这样做。 |
以下逻辑运算符可用于对表达式进行分组:
| Operator | 描述 |
|---|---|
| && | 逻辑 和 运算符用于对两个表达式进行分组。 |
| logical 或 运算符用于对两个表达式进行分组。 |
AND 的语法是:
${leftValue} OP rightValue && ${leftValue} OP rightValue
${leftValue} OP rightValue && ${leftValue} OP rightValue
而 OR 的语法是:
${leftValue} OP rightValue || ${leftValue} OP rightValue
${leftValue} OP rightValue || ${leftValue} OP rightValue
一些示例:
124.5.1. 与不同类型的比较 复制链接链接已复制到粘贴板!
当您与不同类型(如 String 和 int)进行比较时,您必须小心。Camel 将使用左侧的类型作为第一优先级。如果无法根据该类型比较这两个值,并且回退到右侧类型。
这意味着您可以颠倒值来强制执行特定类型的值。假设上面的 bar 值是一个 String。然后您可以反转 equation:
simple("100 < ${header.bar}")
simple("100 < ${header.bar}")
然后,这样可确保 int 类型用作第一优先级。
如果 Camel 团队改进了二进制比较操作来首选基于 String 的数字类型,则以后可能会更改此设置。最常见的是 String 类型,与数字进行比较时会导致问题。
// testing for null
simple("${header.baz} == null")
// testing for not null
simple("${header.baz} != null")
// 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}")
simple("${header.date} == ${date:now:yyyyMMdd}")
simple("${header.type} == ${bean:orderService?method=getOrderType}")
和包含 的例子,测试标题是否包含 Camel 一词
simple("${header.title} contains 'Camel'")
simple("${header.title} contains 'Camel'")
和带有 regex 的示例,测试数字标头是否为 4 位值:
simple("${header.number} regex '\\d{4}'")
simple("${header.number} regex '\\d{4}'")
如果标头等于列表中的任何值,则最后是一个示例。每个元素必须用逗号分开,并且没有空格。
这也适用于数字等,因为 Camel 会将每个元素转换为左侧类型的类型。
simple("${header.type} in 'gold,silver'")
simple("${header.type} in 'gold,silver'")
对于最后 3,我们也支持使用以下内容的 negate 测试:
simple("${header.type} !in 'gold,silver'")
simple("${header.type} !in 'gold,silver'")
您可以测试该类型是否是特定的实例,例如,一个字符串
simple("${header.type} is 'java.lang.String'")
simple("${header.type} is 'java.lang.String'")
我们为所有 java.lang 类型添加了简写,以便您可以将其写为:
simple("${header.type} is 'String'")
simple("${header.type} is 'String'")
也支持范围。范围间隔需要数字,并且来自 和 end 都包含。例如,测试值是否为 100 到 199 之间:
simple("${header.number} range 100..199")
simple("${header.number} range 100..199")
请注意,我们在没有空格的范围中使用 ..。它采用与 Groovy 相同的语法。
simple("${header.number} range '100..199'")
simple("${header.number} range '100..199'")
由于 XML DSL 没有任何权限作为其各种构建器方法的 Java DSL,因此您必须使用一些其他语言来使用简单的运算符进行测试。现在,您可以使用简单语言进行此操作。在以下示例中,我们希望测试标头是否为小部件顺序:
124.5.2. 使用 和 / 或 复制链接链接已复制到粘贴板!
如果您有两个表达式,您可以将它们与 & amp;& 或 || 运算符合并。
例如:
simple("${header.title} contains 'Camel' && ${header.type'} == 'gold'")
simple("${header.title} contains 'Camel' && ${header.type'} == 'gold'")
当然,还支持 ||。示例将是:
simple("${header.title} contains 'Camel' || ${header.type'} == 'gold'")
simple("${header.title} contains 'Camel' || ${header.type'} == 'gold'")