{"record":{"id":"f0dffc7e25f5a481","repo":"flowable/flowable-engine","slug":"no-formengine","errorCode":null,"errorMessage":"No formEngine '","messagePattern":"No formEngine '","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine/src/main/java/org/flowable/engine/impl/cmd/GetRenderedStartFormCmd.java","lineNumber":65,"sourceCode":"\n        if (processDefinition == null) {\n            throw new FlowableObjectNotFoundException(\"Process Definition '\" + processDefinitionId + \"' not found\", ProcessDefinition.class);\n        }\n\n        if (Flowable5Util.isFlowable5ProcessDefinition(processDefinition, commandContext)) {\n            return Flowable5Util.getFlowable5CompatibilityHandler().getRenderedStartForm(processDefinitionId, formEngineName);\n        }\n\n        FormHandlerHelper formHandlerHelper = CommandContextUtil.getProcessEngineConfiguration(commandContext).getFormHandlerHelper();\n        StartFormHandler startFormHandler = formHandlerHelper.getStartFormHandler(commandContext, processDefinition);\n        if (startFormHandler == null) {\n            return null;\n        }\n\n        FormEngine formEngine = CommandContextUtil.getProcessEngineConfiguration(commandContext).getFormEngines().get(formEngineName);\n\n        if (formEngine == null) {\n            throw new FlowableException(\"No formEngine '\" + formEngineName + \"' defined process engine configuration\");\n        }\n\n        StartFormData startForm = startFormHandler.createStartFormData(processDefinition);\n\n        return formEngine.renderStartForm(startForm);\n    }\n}\n","sourceCodeStart":47,"sourceCodeEnd":73,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine/src/main/java/org/flowable/engine/impl/cmd/GetRenderedStartFormCmd.java#L47-L73","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Call getRenderedStartForm(processDefinitionId) without an engine name to use the default form engine.","Register the form engine: processEngineConfiguration.getFormEngines().put(name, new MyFormEngine()) or via a ProcessEngineConfigurator before engine startup.","Fix the engine-name string; verify available names by inspecting processEngineConfiguration.getFormEngines().keySet().","If forms were migrated from Activiti 5, confirm the form engine implementation is present on the classpath (missing dependency)."],"exampleFix":"// before (engine not registered, name typo)\nObject form = formService.getRenderedStartForm(pdId, \"Juel\");\n// after — register engine in config\nprocessEngineConfiguration.getFormEngines().put(\"juel\", new JuelFormEngine());\nObject form = formService.getRenderedStartForm(pdId, \"juel\");","handlingStrategy":"validation","validationCode":"Set<String> available = processEngineConfiguration.getFormEngines().keySet();\nif (!available.contains(formEngineName)) throw new IllegalArgumentException(\"Form engine '\" + formEngineName + \"' not registered; available: \" + available);","typeGuard":null,"tryCatchPattern":"try {\n    return formService.getRenderedStartForm(pdId, formEngineName);\n} catch (FlowableException e) {\n    if (e.getMessage().startsWith(\"No formEngine\")) { /* fall back to default form handling */ }\n}","preventionTips":["Omit the engine-name argument when the default form engine is sufficient.","Register custom form engines in the engine configuration at startup, before any command runs.","Verify configuration after ProcessEngine build: assert getFormEngines() contains the names you use.","Check dependencies (form engine implementations on the classpath) after upgrades."],"tags":["form-engine","configuration","flowable"],"backgroundTag":"missing-required-config-field","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}