flowable/flowable-engine · error · FlowableIllegalArgumentException
Event type cannot be null.
Error message
Event type cannot be null.
What it means
Argument guard in FlowableEventSupport.dispatchEvent: the event object exists but its getType() returns null. The dispatcher routes events to listeners by type, so an event without a type cannot be delivered and is rejected.
Solutions
- Set a FlowableEventType on every custom event before dispatching
- Reuse the engine's standard event types or well-formed custom type constants
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/event/FlowableEventSupport.java:93 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/ead8cd3d0a39aa66.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/event/FlowableEventSupport.java:93
}
}
}
public void removeEventListener(FlowableEventListener listenerToRemove) {
eventListeners.remove(listenerToRemove);
for (List<FlowableEventListener> listeners : typedListeners.values()) {
listeners.remove(listenerToRemove);
}
}
public void dispatchEvent(FlowableEvent event) {
if (event == null) {
throw new FlowableIllegalArgumentException("Event cannot be null.");
}
if (event.getType() == null) {
throw new FlowableIllegalArgumentException("Event type cannot be null.");
}
// Call global listeners
if (!eventListeners.isEmpty()) {
for (FlowableEventListener listener : eventListeners) {
dispatchEvent(event, listener);
}
}
// Call typed listeners, if any
List<FlowableEventListener> typed = typedListeners.get(event.getType());
if (typed != null && !typed.isEmpty()) {
for (FlowableEventListener listener : typed) {
dispatchEvent(event, listener);
}
}
}
View on GitHub (pinned to d6d39ce1c6)