{"record":{"id":"d171f438f17973a5","repo":"flowable/flowable-engine","slug":"no-formengine-defined-process-engine-configurat-d171f4","errorCode":null,"errorMessage":"No formEngine '' defined process engine configuration","messagePattern":"No formEngine '' defined process engine configuration","errorType":"exception","errorClass":"ActivitiException","httpStatus":null,"severity":"error","filePath":"modules/flowable5-engine/src/main/java/org/activiti/engine/impl/cmd/GetRenderedTaskFormCmd.java","lineNumber":66,"sourceCode":"            throw new ActivitiObjectNotFoundException(\"Task '\" + taskId + \"' not found\", Task.class);\n        }\n\n        if (task.getTaskDefinition() == null) {\n            throw new ActivitiException(\"Task form definition for '\" + taskId + \"' not found\");\n        }\n\n        TaskFormHandler taskFormHandler = task.getTaskDefinition().getTaskFormHandler();\n        if (taskFormHandler == null) {\n            return null;\n        }\n\n        FormEngine formEngine = commandContext\n                .getProcessEngineConfiguration()\n                .getFormEngines()\n                .get(formEngineName);\n\n        if (formEngine == null) {\n            throw new ActivitiException(\"No formEngine '\" + formEngineName + \"' defined process engine configuration\");\n        }\n\n        TaskFormData taskForm = taskFormHandler.createTaskForm(task);\n\n        return formEngine.renderTaskForm(taskForm);\n    }\n}\n","sourceCodeStart":48,"sourceCodeEnd":74,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable5-engine/src/main/java/org/activiti/engine/impl/cmd/GetRenderedTaskFormCmd.java#L48-L74","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Inspect the task's form definition to see which formEngineName it requests.","Register that FormEngine in the ProcessEngineConfiguration before engine startup.","Fall back to a built-in engine by removing the custom flowable:formEngine attribute from the BPMN.","Fix typos in the formEngine attribute."],"exampleFix":"// before\n<userTask id=\"t1\" flowable:formKey=\"f\" flowable:formEngine=\"myEngine\" /> <!-- unregistered -->\n// after\nconfiguration.getFormEngines().put(\"myEngine\", new MyFormEngine()); // register before buildProcessEngine()","handlingStrategy":"validation","validationCode":"if (!processEngineConfiguration.getFormEngines().containsKey(formEngineName)) {\n    throw new IllegalStateException(\"Form engine not registered: \" + formEngineName);\n}","typeGuard":null,"tryCatchPattern":"try {\n    taskService.getRenderedTaskForm(taskId);\n} catch (ActivitiException e) {\n    if (e.getMessage().contains(\"No formEngine\")) {\n        // register engine or fall back to default\n    }\n}","preventionTips":["Wire every custom FormEngine into the config at boot","Audit BPMN files for flowable:formEngine values and match them to registered keys","Add an integration test rendering forms for all deployed definitions"],"tags":["form-engine","configuration","task","workflow"],"backgroundTag":"invalid-config-value","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}