flowable/flowable-engine · error · FlowableException

No formEngine '

Error message

No formEngine '

What it means

FlowableException thrown by GetRenderedStartFormCmd.execute when the process engine configuration has no FormEngine registered under the requested formEngineName. The command looks the engine up in ProcessEngineConfiguration.getFormEngines() and fails because the map lookup returns null.

Source

Thrown at modules/flowable-engine/src/main/java/org/flowable/engine/impl/cmd/GetRenderedStartFormCmd.java:65

        if (processDefinition == null) {
            throw new FlowableObjectNotFoundException("Process Definition '" + processDefinitionId + "' not found", ProcessDefinition.class);
        }

        if (Flowable5Util.isFlowable5ProcessDefinition(processDefinition, commandContext)) {
            return Flowable5Util.getFlowable5CompatibilityHandler().getRenderedStartForm(processDefinitionId, formEngineName);
        }

        FormHandlerHelper formHandlerHelper = CommandContextUtil.getProcessEngineConfiguration(commandContext).getFormHandlerHelper();
        StartFormHandler startFormHandler = formHandlerHelper.getStartFormHandler(commandContext, processDefinition);
        if (startFormHandler == null) {
            return null;
        }

        FormEngine formEngine = CommandContextUtil.getProcessEngineConfiguration(commandContext).getFormEngines().get(formEngineName);

        if (formEngine == null) {
            throw new FlowableException("No formEngine '" + formEngineName + "' defined process engine configuration");
        }

        StartFormData startForm = startFormHandler.createStartFormData(processDefinition);

        return formEngine.renderStartForm(startForm);
    }
}

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Call getRenderedStartForm(processDefinitionId) without an engine name to use the default form engine.
  2. Register the form engine: processEngineConfiguration.getFormEngines().put(name, new MyFormEngine()) or via a ProcessEngineConfigurator before engine startup.
  3. Fix the engine-name string; verify available names by inspecting processEngineConfiguration.getFormEngines().keySet().
  4. If forms were migrated from Activiti 5, confirm the form engine implementation is present on the classpath (missing dependency).

Example fix

// before (engine not registered, name typo)
Object form = formService.getRenderedStartForm(pdId, "Juel");
// after — register engine in config
processEngineConfiguration.getFormEngines().put("juel", new JuelFormEngine());
Object form = formService.getRenderedStartForm(pdId, "juel");
Defensive patterns

Strategy: validation

Validate before calling

Set<String> available = processEngineConfiguration.getFormEngines().keySet();
if (!available.contains(formEngineName)) throw new IllegalArgumentException("Form engine '" + formEngineName + "' not registered; available: " + available);

Try / catch

try {
    return formService.getRenderedStartForm(pdId, formEngineName);
} catch (FlowableException e) {
    if (e.getMessage().startsWith("No formEngine")) { /* fall back to default form handling */ }
}

Prevention

When it happens

Trigger: formService.getRenderedStartForm(processDefinitionId, formEngineName) with a formEngineName that is not registered — e.g. "juel"/custom name while only the default form engines exist, or a typo in the engine name.

Common situations: Custom form engine not registered on the process engine configuration (missing formEngine init or custom config bean removed); a rename between Flowable/Activiti versions; copying code that references a form engine from another project's configuration.

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


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