{"record":{"id":"bb877d954fdfbffb","repo":"flowable/flowable-engine","slug":"processdefinitionid-is-required","errorCode":null,"errorMessage":"processDefinitionId is required","messagePattern":"processDefinitionId is required","errorType":"exception","errorClass":"FlowableIllegalArgumentException","httpStatus":400,"severity":"error","filePath":"modules/flowable-rest/src/main/java/org/flowable/rest/service/api/runtime/process/ProcessInstanceResource.java","lineNumber":303,"sourceCode":"        if (restApiInterceptor != null) {\n            restApiInterceptor.injectActivity(processInstance, injectActivityRequest);\n        }\n\n        if (\"task\".equalsIgnoreCase(injectActivityRequest.getInjectionType())) {\n            DynamicUserTaskBuilder taskBuilder = new DynamicUserTaskBuilder();\n            taskBuilder.id(injectActivityRequest.getId())\n                .name(injectActivityRequest.getName())\n                .assignee(injectActivityRequest.getAssignee());\n            \n            if (injectActivityRequest.getTaskId() != null) {\n                dynamicBpmnService.injectParallelUserTask(injectActivityRequest.getTaskId(), taskBuilder);\n            } else {\n                dynamicBpmnService.injectUserTaskInProcessInstance(processInstanceId, taskBuilder);\n            }\n        \n        } else if (\"subprocess\".equalsIgnoreCase(injectActivityRequest.getInjectionType())) {\n            if (StringUtils.isEmpty(injectActivityRequest.getProcessDefinitionId())) {\n                throw new FlowableIllegalArgumentException(\"processDefinitionId is required\");\n            }\n            DynamicEmbeddedSubProcessBuilder subProcessBuilder = new DynamicEmbeddedSubProcessBuilder();\n            subProcessBuilder.id(injectActivityRequest.getId())\n                .processDefinitionId(injectActivityRequest.getProcessDefinitionId());\n            \n            if (injectActivityRequest.getTaskId() != null) {\n                dynamicBpmnService.injectParallelEmbeddedSubProcess(injectActivityRequest.getTaskId(), subProcessBuilder);\n            } else {\n                dynamicBpmnService.injectEmbeddedSubProcessInProcessInstance(processInstanceId, subProcessBuilder);\n            }\n        \n        } else {\n            throw new FlowableIllegalArgumentException(\"injection type is not supported \" + injectActivityRequest.getInjectionType());\n        }\n    }\n\n    protected ProcessInstanceResponse activateProcessInstance(ProcessInstance processInstance) {\n        if (!processInstance.isSuspended()) {","sourceCodeStart":285,"sourceCodeEnd":321,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-rest/src/main/java/org/flowable/rest/service/api/runtime/process/ProcessInstanceResource.java#L285-L321","documentation":"Flowable REST throws FlowableIllegalArgumentException when injecting a dynamic 'subprocess' into a running process instance without providing processDefinitionId in the request body. The embedded subprocess needs a reference to a deployed dynamic subprocess definition.","triggerScenarios":"POST /runtime/process-instances/{id}/inject-activity with {\"injectionType\":\"subprocess\",\"id\":\"...\"} but no processDefinitionId field.","commonSituations":"Developer reuses the JSON body used for injectionType 'usertask' (which doesn't need processDefinitionId); forgot to deploy the subprocess definition first and so had no id to reference.","solutions":["Add processDefinitionId to the inject-activity request body.","First deploy the dynamic subprocess definition via DynamicBpmnService / repository API and use its returned definition id.","Confirm injectionType really should be 'subprocess' and not 'usertask'."],"exampleFix":"// before\n{\"injectionType\":\"subprocess\",\"id\":\"mySubProcess\"}\n// after\n{\"injectionType\":\"subprocess\",\"id\":\"mySubProcess\",\"processDefinitionId\":\"myProcess:1:104\",\"taskId\":\"userTask1\"}","handlingStrategy":"validation","validationCode":"if (injectionType === 'subprocess' && !body.processDefinitionId) throw new Error('processDefinitionId required for subprocess injection');","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Deploy the dynamic subprocess definition before injecting","Build inject-activity payloads with typed request objects","Document required fields per injectionType"],"tags":["rest-api","validation","dynamic-bpmn"],"backgroundTag":"missing-required-argument","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}