{"record":{"id":"06c7d1f6971ac5ff","repo":"flowable/flowable-engine","slug":"no-formengine-06c7d1","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/GetRenderedTaskFormCmd.java","lineNumber":67,"sourceCode":"\n        if (taskId == null) {\n            throw new FlowableIllegalArgumentException(\"Task id should not be null\");\n        }\n\n        ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);\n        TaskEntity task = processEngineConfiguration.getTaskServiceConfiguration().getTaskService().getTask(taskId);\n        if (task == null) {\n            throw new FlowableObjectNotFoundException(\"Task '\" + taskId + \"' not found\", Task.class);\n        }\n\n        FormHandlerHelper formHandlerHelper = processEngineConfiguration.getFormHandlerHelper();\n        TaskFormHandler taskFormHandler = formHandlerHelper.getTaskFormHandlder(task);\n        if (taskFormHandler != null) {\n\n            FormEngine formEngine = processEngineConfiguration.getFormEngines().get(formEngineName);\n\n            if (formEngine == null) {\n                throw new FlowableException(\"No formEngine '\" + formEngineName + \"' defined process engine configuration\");\n            }\n\n            TaskFormData taskForm = taskFormHandler.createTaskForm(task);\n\n            return formEngine.renderTaskForm(taskForm);\n        }\n\n        return null;\n    }\n}\n","sourceCodeStart":49,"sourceCodeEnd":78,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine/src/main/java/org/flowable/engine/impl/cmd/GetRenderedTaskFormCmd.java#L49-L78","documentation":"GetRenderedTaskFormCmd.execute looks up a FormEngine by name from processEngineConfiguration.getFormEngines() and throws FlowableException when the map contains no entry for the requested formEngineName. The engine only registers built-in form engines (e.g. 'juel') at configuration time, so a name that was never registered cannot render the task form.","triggerScenarios":"Calling TaskService.getRenderedTaskForm(taskId) or FormService.getRenderedTaskForm with a taskFormEngineName that is not a key in ProcessEngineConfigurationImpl.formEngines.","commonSituations":"Typo in the form engine name passed to the form property/ API call; using a name from an older Activiti version ('form' engine removed/renamed); building a custom engine config that disables default form engines; copy-pasted config referencing a custom FormEngine that was never added via processEngineConfiguration.setFormEngines(...) or a custom EngineConfigurator.","solutions":["Pass a registered form engine name (default 'juel') or omit the formEngineName argument so the default is used","Register your custom FormEngine on the ProcessEngineConfiguration (engineConfig.setFormEngines(map-with-your-engine) or add via an EngineConfigurator) before starting the engine","Log processEngineConfiguration.getFormEngines().keySet() at startup and match your requested name against it","If the process definition has no task form, guard the null taskFormHandler branch instead of relying on form rendering"],"exampleFix":"// before\nString rendered = formService.getRenderedTaskForm(taskId, \"myFormEngine\");\n// after\nString rendered = formService.getRenderedTaskForm(taskId, \"juel\"); // or register the engine:\nconfiguration.setFormEngines(Map.of(\"myFormEngine\", new MyFormEngine()));","handlingStrategy":"validation","validationCode":"if (!processEngineConfiguration.getFormEngines().containsKey(formEngineName)) {\n    throw new IllegalArgumentException(\"Unknown form engine: \" + formEngineName);\n}","typeGuard":"boolean hasFormEngine(String name) {\n    return name != null && processEngineConfiguration.getFormEngines().containsKey(name);\n}","tryCatchPattern":"try {\n    return formService.getRenderedTaskForm(taskId, engineName);\n} catch (FlowableException e) {\n    if (e.getMessage() != null && e.getMessage().startsWith(\"No formEngine\")) {\n        return formService.getRenderedTaskForm(taskId, \"juel\"); // fall back to default engine\n    }\n    throw e;\n}","preventionTips":["Always use the default 'juel' engine name unless you registered a custom FormEngine","Register custom form engines in an EngineConfigurator so they exist before any command runs","At startup, assert the configured formEngines map contains the names your processes reference"],"tags":["flowable","form-engine","configuration"],"backgroundTag":"missing-config-key","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"}