Getting cannot coerce string to boolean error when running the below expression in mule4
vars.userId != null and (vars.page != null and vars.page contains ('Redeem')) or (vars.actionName != null and vars.actionName contains ('Redeem'))
This is the error:
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'))".
Note: The expression is returning expected output when evaluated separately. Example: when evaluated this expression vars.actionName != null and vars.actionName contains ('Redeem')
returns true
but when added vars.userId != null and (vars.page != null and vars.page contains ('Redeem')) or (vars.actionName != null and vars.actionName contains ('Redeem'))
it starts throwing error
Wrap the contains call in its own Parentheses. (vars.page != null) and (vars.page contains ('Redeem')
and
operator will execute before contains
Therefore the expression vars.page != null and vars.page contains ('Redeem')
could** throw an error because DataWeave interpret this:
vars.page != null
. Lets say it is not so this result to true
.(vars.page != null and vars.page)
or true and vars.page
. I believe the vars.page
is a String, therefore you are seeing that error because DW is trying to convert String to Boolean.The resolution is simple. Just wrap the contains call in its own Parentheses. (vars.page != null) and (vars.page contains ('Redeem')
**about that could (also why the other expression is working separately). The reason why the expression vars.actionName != null and vars.actionName contains ('Redeem')
worked on its own is because of the logical and
and or
operators short-circuit, meaning they don't evaluate the remaining parts if they don't have to. So if the first expression vars.actionName != null
evaluates to false, then checking the rest of the conditions is not necessary because the result will always be false, so the DW skips the evaluation of the remaining expression. Therefore, depending on the value of actionName
your expression could fail.
You can read more about short circuiting here. https://en.m.wikipedia.org/wiki/Short-circuit_evaluation