无法将字符串强制转换为 mule4 中的布尔值

Cannot coerce string to boolean in mule4

当 运行 mule4 中的以下表达式

时,Getting cannot coerce string to boolean error
vars.userId != null and (vars.page != null and vars.page contains ('Redeem')) or (vars.actionName != null and vars.actionName contains ('Redeem'))

这是错误:

org.mule.runtime.core.api.expression.ExpressionRuntimeException: "Cannot coerce String (ungatedRedeem) to Boolean
Trace:
  at contains (Unknown)
  at main (line: 1, column: 58)" evaluating expression: "vars.userId != null and (vars.page != null and vars.page contains ('Redeem')) or (vars.actionName != null and vars.actionName contains ('Redeem'))". 

注意:表达式在单独计算时返回预期输出。示例:当评估此表达式时 vars.actionName != null and vars.actionName 包含 ('Redeem') 返回 true 并且当添加“vars.userId != null and (vars.page ! = null and vars.page contains ('Redeem')) or (vars.actionName != null and vars.actionName contains ('Redeem'))" getting error

尝试添加括号以使优先级明确。在评估 contains().

之前,它正在将变量之一视为 and 参数

(vars.actionName != null and (vars.actionName contains ('Redeem')))

vars.page contains ('Redeem') 相同。将其更改为 (vars.page contains ('Redeem')).

简答:

将 contains 调用括在它自己的括号中。 (vars.page != null) and (vars.page contains ('Redeem')

说明

您遇到的问题是因为 precedence of different operator in DataWeave 的顺序。如果你通过 link 你会注意到,在你的表达式中 and 运算符将在 contains

之前执行

因此表达式 vars.page != null and vars.page contains ('Redeem') 可能会** 抛出错误,因为 DataWeave 解释为:

  1. DW 首先检查是否vars.page != null。可以说 true.
  2. 的结果并非如此
  3. 然后它会尝试执行 (vars.page != null and vars.page)true and vars.page。我相信 vars.page 是一个字符串,因此您会看到该错误,因为 DW 正在尝试将字符串转换为布尔值。

解决方法很简单。只需将 contains 调用包装在它自己的括号中。 (vars.page != null) and (vars.page contains ('Redeem')

**关于那个可以 (还有为什么另一个表达式单独工作)。表达式 vars.actionName != null and vars.actionName contains ('Redeem') 独立工作的原因是因为逻辑 andor 运算符 short-circuit,这意味着如果他们不这样做,他们就不会评估其余部分不必。因此,如果第一个表达式 vars.actionName != null 的计算结果为 false,则无需检查其余条件,因为结果始终为 false,因此 DW 会跳过对剩余表达式的计算。因此,根据 actionName 的值,您的表达式 可能会 失败。 您可以在此处阅读有关短路的更多信息。 https://en.m.wikipedia.org/wiki/Short-circuit_evaluation