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

  1. Inspect the task's form definition to see which formEngineName it requests.
  2. Register that FormEngine in the ProcessEngineConfiguration before engine startup.
  3. Fall back to a built-in engine by removing the custom flowable:formEngine attribute from the BPMN.
  4. 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

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


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/d171f438f17973a5. Report an issue: GitHub.