flowable/flowable-engine · error · FlowableException
Invalid 'engine' for
Error message
Invalid 'engine' for ${entityType} with id ${id} : ${tag} What it means
isV5Entity distinguishes engine versions via a tag: a version-5 tag means v5, and null means Flowable 6. If the tag is neither of these (some unexpected non-null value), Flowable cannot determine which engine produced the entity and throws this FlowableException. It guards against corrupted or foreign entity metadata.
Solutions
- Inspect the tag column for the entity in the database (ACT_RE_PROCDEF / ACT_RE_DEPLOYMENT) and correct or remove the invalid value.
- Restore the entity from a valid backup or redeploy the process definition.
- Ensure no other tool or engine version writes these tables with foreign tag formats.
- If migrating, follow the official migration procedure so tags are converted correctly.
Example fix
// before: manual DB edit left tag 'activiti-legacy' UPDATE ACT_RE_PROCDEF SET ENGINE_VERSION_ = 'activiti-legacy' WHERE ID_ = '...'; // after: use null for Flowable 6 entities UPDATE ACT_RE_PROCDEF SET ENGINE_VERSION_ = NULL WHERE ID_ = '...';
Defensive patterns
Strategy: validation
Validate before calling
// validate engine tag before engine calls
String tag = getEngineVersionTagFromDb(id);
if (tag != null && !Flowable5Util.isVersion5Tag(tag)) {
throw new IllegalStateException("Unknown engine tag '" + tag + "' for entity " + id);
} Prevention
- Never hand-edit engine metadata columns
- Restrict direct DB write access to Flowable tables
- Use official migration tooling so engine tags stay consistent
When it happens
Trigger: isV5Entity (via isFlowable5Deployment / isFlowable5ProcessDefinition) is passed a tag value that is non-null and not recognized as the v5 tag — e.g. a manually edited or corrupted metadata tag in the deployment/definition tables.
Common situations: Database rows hand-edited or written by another tool with an unknown engine tag; upgrades between intermediate versions that used different tag conventions; mixing engine versions on a shared database.
Understand the failure class
Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.
Related errors
- with id has a v5 tag and flowable 5 compatibility is not…
- Can't deploy a v5 deployment with no flowable 5…
- Flowable 5 process definitions are not supported
- Flowable 5 process definitions are not supported
- Flowable 5 process definitions are not supported for
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/04ca7fa846057aa5.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-engine/src/main/java/org/flowable/engine/impl/util/Flowable5Util.java:134
public static boolean isFlowable5ProcessDefinition(ProcessDefinition processDefinition, ProcessEngineConfigurationImpl processEngineConfiguration) {
if (isV5Entity(processDefinition.getEngineVersion(), processDefinition.getId(), "process definition", processEngineConfiguration)) {
return true;
}
return false;
}
public static boolean isV5Entity(String tag, String id, String entityType, ProcessEngineConfigurationImpl processEngineConfiguration) {
if (isVersion5Tag(tag)) {
if (!processEngineConfiguration.isFlowable5CompatibilityEnabled() || processEngineConfiguration.getFlowable5CompatibilityHandler() == null) {
throw new FlowableException(entityType + " with id " + id + " has a v5 tag and flowable 5 compatibility is not enabled");
}
return true;
} else {
if (tag != null) {
throw new FlowableException("Invalid 'engine' for " + entityType + " with id " + id + " : " + tag);
}
return false;
}
}
public static boolean isVersion5Tag(String tag) {
return V5_ENGINE_TAG.equals(tag) || "activiti-5".equals(tag);
}
public static Flowable5CompatibilityHandler getFlowable5CompatibilityHandler() {
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration();
Flowable5CompatibilityHandler flowable5CompatibilityHandler = null;
if (processEngineConfiguration != null) {
flowable5CompatibilityHandler = processEngineConfiguration.getFlowable5CompatibilityHandler();
}
if (flowable5CompatibilityHandler == null) {View on GitHub (pinned to d6d39ce1c6)