flowable/flowable-engine · error · ActivitiException
No startFormHandler defined in process ''
Error message
No startFormHandler defined in process ''
What it means
Deployment resolution failure in flowable5 GetStartFormCmd.execute: the process definition was deployed, but its parsed definition carries no startFormHandler (no start form defined in the BPMN), so no start form data can be returned.
Source
Thrown at modules/flowable5-engine/src/main/java/org/activiti/engine/impl/cmd/GetStartFormCmd.java:51
protected String processDefinitionId;
public GetStartFormCmd(String processDefinitionId) {
this.processDefinitionId = processDefinitionId;
}
@Override
public StartFormData execute(CommandContext commandContext) {
ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) commandContext
.getProcessEngineConfiguration()
.getDeploymentManager()
.findDeployedProcessDefinitionById(processDefinitionId);
if (processDefinition == null) {
throw new ActivitiObjectNotFoundException("No process definition found for id '" + processDefinitionId + "'", ProcessDefinition.class);
}
StartFormHandler startFormHandler = processDefinition.getStartFormHandler();
if (startFormHandler == null) {
throw new ActivitiException("No startFormHandler defined in process '" + processDefinitionId + "'");
}
return startFormHandler.createStartFormData(processDefinition);
}
}
View on GitHub (pinned to d6d39ce1c6)
Solutions
- Add form metadata to the start event in the BPMN (flowable:formKey or a start form handler) and redeploy.
- Check startFormHandler is configured (default DefaultStartFormHandler is normally always set — verify parser configuration wasn't overridden).
- Guard the caller: only call getStartForm for definitions known to declare a start form.
- If no form is needed, treat the null-returning rendered-form command or a query-first approach as the guard.
Example fix
// before <startEvent id="start" /> <!-- no form --> // after <startEvent id="start" flowable:formKey="startForm" flowable:initiator="initiator" />
Defensive patterns
Strategy: validation
Validate before calling
StartFormData data = null;
try {
data = formService.getStartForm(processDefinitionId);
} catch (ActivitiException e) {
if (e.getMessage().startsWith("No startFormHandler")) {
data = null; // definition declares no start form
}
} Try / catch
try {
formService.getStartForm(pdId);
} catch (ActivitiException e) {
if (e.getMessage().contains("No startFormHandler defined")) {
// no start form declared — show default UI
}
} Prevention
- Declare flowable:formKey on every start event that needs a form
- Redeploy after changing form metadata
- Document which process definitions intentionally have no start form
When it happens
Trigger: Calling FormService.getStartForm(processDefinitionId) on a definition whose <startEvent> carries no formKey/formHandler mapping and no default StartFormHandler was resolved during parsing.
Common situations: Deploying a BPMN without flowable:formKey on the start event and then querying its start form; relying on a FormHandler that was removed in a config/parser change; mixed engine versions where the parser no longer sets the handler.
Understand the failure class
Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.
Related errors
- ${sequenceFlowId} does not match a sequence flow for ${deleg
- Cannot trigger ${execution} : no current flow element found.
- No outgoing sequence flow of the inclusive gateway '${activi
- Not supported to signal this execution
- No process definition found for id ''
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/41c1c6ae3a77cf16.
Report an issue: GitHub.