flowable/flowable-engine · error · ActivitiException
No formEngine '' defined process engine configuration
Error message
No formEngine '' defined process engine configuration
What it means
Same family as error 4551 but on the task side: the formEngineName resolved from the task's form definition is not present in the engine configuration's formEngines map, so ActivitiException is thrown before rendering the task form.
Source
Thrown at modules/flowable5-engine/src/main/java/org/activiti/engine/impl/cmd/GetRenderedTaskFormCmd.java:66
throw new ActivitiObjectNotFoundException("Task '" + taskId + "' not found", Task.class);
}
if (task.getTaskDefinition() == null) {
throw new ActivitiException("Task form definition for '" + taskId + "' not found");
}
TaskFormHandler taskFormHandler = task.getTaskDefinition().getTaskFormHandler();
if (taskFormHandler == null) {
return null;
}
FormEngine formEngine = commandContext
.getProcessEngineConfiguration()
.getFormEngines()
.get(formEngineName);
if (formEngine == null) {
throw new ActivitiException("No formEngine '" + formEngineName + "' defined process engine configuration");
}
TaskFormData taskForm = taskFormHandler.createTaskForm(task);
return formEngine.renderTaskForm(taskForm);
}
}
View on GitHub (pinned to d6d39ce1c6)
Solutions
- Inspect the task's form definition to see which formEngineName it requests.
- Register that FormEngine in the ProcessEngineConfiguration before engine startup.
- Fall back to a built-in engine by removing the custom flowable:formEngine attribute from the BPMN.
- Fix typos in the formEngine attribute.
Example fix
// before
<userTask id="t1" flowable:formKey="f" flowable:formEngine="myEngine" /> <!-- unregistered -->
// after
configuration.getFormEngines().put("myEngine", new MyFormEngine()); // register before buildProcessEngine() Defensive patterns
Strategy: validation
Validate before calling
if (!processEngineConfiguration.getFormEngines().containsKey(formEngineName)) {
throw new IllegalStateException("Form engine not registered: " + formEngineName);
} Try / catch
try {
taskService.getRenderedTaskForm(taskId);
} catch (ActivitiException e) {
if (e.getMessage().contains("No formEngine")) {
// register engine or fall back to default
}
} Prevention
- Wire every custom FormEngine into the config at boot
- Audit BPMN files for flowable:formEngine values and match them to registered keys
- Add an integration test rendering forms for all deployed definitions
When it happens
Trigger: Calling TaskService.getRenderedTaskForm(taskId) where the task's form definition declares flowable:formEngine="xyz" that was never registered in ProcessEngineConfiguration, or the API call passes an unregistered formEngineName.
Common situations: Custom form engines not wired into the engine config; typo in the BPMN formEngine attribute; switching from a custom-engine setup to default config where only 'form'/'juel' exist.
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
- No formEngine '' defined process engine configuration
- Form engine is not initialized
- Form engine is not initialized
- Form repository service is not available
- Form engine is not initialized
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/d171f438f17973a5.
Report an issue: GitHub.