无法将字符串强制转换为 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 解释为:
- DW 首先检查是否
vars.page != null
。可以说 true
. 的结果并非如此
- 然后它会尝试执行
(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')
独立工作的原因是因为逻辑 and
和 or
运算符 short-circuit,这意味着如果他们不这样做,他们就不会评估其余部分不必。因此,如果第一个表达式 vars.actionName != null
的计算结果为 false,则无需检查其余条件,因为结果始终为 false,因此 DW 会跳过对剩余表达式的计算。因此,根据 actionName
的值,您的表达式 可能会 失败。
您可以在此处阅读有关短路的更多信息。 https://en.m.wikipedia.org/wiki/Short-circuit_evaluation
当 运行 mule4 中的以下表达式
时,Getting cannot coerce string to boolean errorvars.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 解释为:
- DW 首先检查是否
vars.page != null
。可以说true
. 的结果并非如此
- 然后它会尝试执行
(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')
独立工作的原因是因为逻辑 and
和 or
运算符 short-circuit,这意味着如果他们不这样做,他们就不会评估其余部分不必。因此,如果第一个表达式 vars.actionName != null
的计算结果为 false,则无需检查其余条件,因为结果始终为 false,因此 DW 会跳过对剩余表达式的计算。因此,根据 actionName
的值,您的表达式 可能会 失败。
您可以在此处阅读有关短路的更多信息。 https://en.m.wikipedia.org/wiki/Short-circuit_evaluation