If / Else ⚖️
Branches workflow execution based on a boolean condition.
Node type: ifElse
Category: Flow Control
Actor: ifElse (1 thread)
Description
The If/Else node evaluates a JUEL (Java Unified Expression Language) expression and routes execution down the trueFlow or falseFlow path depending on the result.
The condition expression is configured on the outgoing connection (link), not on the node itself. The If/Else node simply branches; each outgoing link carries its own condition.
Properties
The If/Else node itself has no configurable properties in the properties panel. Conditions are set on the outgoing trueFlow and falseFlow links.
Condition Expressions
Conditions are JUEL expressions written on the outgoing connections. They must:
- Be wrapped in
${...} - Evaluate to
trueorfalse
| Operator | Example | Meaning |
|---|---|---|
== | ${status == 'active'} | String equality |
!= | ${classification != 'billing'} | Inequality |
>, < | ${orderTotal > 500} | Numeric comparison |
>=, <= | ${score >= 90} | Numeric comparison |
&& | ${isPremium == 'true' && tier == 'gold'} | Logical AND |
|| | ${isNew == 'true' || isGuest == 'true'} | Logical OR |
! | ${!isCancelled} | Negation |
empty | ${empty customerEmail} | Null/empty check |
| String methods | ${name.startsWith('J')} | Java String methods |
Configuring Conditions in the Designer
- Draw a connection from the If/Else node to the next node
- Select the connection (click on it)
- In the Properties Panel, set the Connection Type to
trueFloworfalseFlow - Enter the Condition Expression (e.g.,
${classification == 'billing'})
The trueFlow link should carry the condition that must be true to follow that path. The falseFlow link is the else branch.
Common Patterns
String Equality Check
trueFlow condition: ${classification == 'billing'}
falseFlow condition: ${classification != 'billing'}
Or simply leave the falseFlow without a condition — it is taken when trueFlow is not taken.
Boolean Check
trueFlow condition: ${isApproved == 'true'}
falseFlow condition: ${isApproved == 'false'}
All workflow variables are strings internally. Compare boolean-like values as strings: 'true' / 'false'.
Numeric Threshold
trueFlow condition: ${orderTotal > 1000}
falseFlow condition: ${orderTotal <= 1000}
Null / Empty Check
trueFlow condition: ${!empty customerEmail}
falseFlow condition: ${empty customerEmail}
Compound Conditions
trueFlow condition: ${isPremium == 'true' && orderCount > 10}
falseFlow condition: ${isPremium != 'true' || orderCount <= 10}
Multi-Branch Decisions
For more than two paths, chain If/Else nodes:
[If/Else: billing?]
↓ trueFlow
[Handle Billing]
↓ falseFlow
[If/Else: technical?]
↓ trueFlow
[Handle Technical]
↓ falseFlow
[Handle General]
Or use a Split node with exclusive mode if you have many parallel paths to evaluate.
Connections
| Connection | Description |
|---|---|
sequenceFlow (incoming) | Any node connects here |
trueFlow (outgoing) | Taken when the condition evaluates to true |
falseFlow (outgoing) | Taken when the condition evaluates to false (or when trueFlow is not taken) |
Both trueFlow and falseFlow are required for a well-formed If/Else. A missing branch may cause the execution path to terminate unexpectedly.
Expression Language Reference
JUEL supports the full Java EL expression syntax:
${varName} → value of varName
${varName.property} → property access
${varName == 'value'} → equality comparison
${varName matches '\\d+'} → regex match
${fn:contains(varName, 'sub')} → string contains (with fn namespace)
${fn:length(varName)} → string/collection length
Available functions depend on the EL context configured in the engine. Standard arithmetic and string comparison operators are always available.
Error Handling
| Scenario | Behavior |
|---|---|
Expression evaluates to true | Takes trueFlow path |
Expression evaluates to false | Takes falseFlow path |
| Expression throws evaluation error | Process instance fails with CONDITION_ERROR |
| Variable referenced in condition is null | empty check returns true; comparison may throw — use null-safe patterns |
Best Practices
- Always define both
trueFlowandfalseFlowconnections - Use
emptyto check for null variables before comparing:${!empty status && status == 'active'} - Quote string values:
'active'notactive - For complex branching with 3+ paths, consider a Script Task to reduce complexity
- Add descriptive labels to connections (shown in the designer) to make the flow readable