{"record":{"id":"197bf21836602567","repo":"flowable/flowable-engine","slug":"a-resource-name-is-mandatory","errorCode":null,"errorMessage":"A resource name is mandatory","messagePattern":"A resource name is mandatory","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":400,"severity":"error","filePath":"modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/model/EventModelBuilderImpl.java","lineNumber":131,"sourceCode":"        eventPayloadDefinitions.put(name, payload);\n        return this;\n    }\n\n    @Override\n    public EventModelBuilder fullPayload(String name) {\n        eventPayloadDefinitions.put(name, EventPayload.fullPayload(name));\n        return this;\n    }\n\n    @Override\n    public EventModel createEventModel() {\n        return buildEventModel();\n    }\n\n    @Override\n    public EventDeployment deploy() {\n        if (resourceName == null) {\n            throw new FlowableIllegalArgumentException(\"A resource name is mandatory\");\n        }\n        \n        EventModel eventModel = buildEventModel();\n\n        return eventRepository.createDeployment()\n            .name(deploymentName)\n            .addEventDefinition(resourceName, eventJsonConverter.convertToJson(eventModel))\n            .category(category)\n            .parentDeploymentId(parentDeploymentId)\n            .tenantId(deploymentTenantId)\n            .deploy();\n    }\n\n    protected EventModel buildEventModel() {\n        EventModel eventModel = new EventModel();\n\n        if (StringUtils.isNotEmpty(key)) {\n            eventModel.setKey(key);","sourceCodeStart":113,"sourceCodeEnd":149,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/model/EventModelBuilderImpl.java#L113-L149","documentation":"EventModelBuilderImpl.deploy() first validates that a resource name was provided, because the deployed event model must be stored under a named resource in the deployment. Deploying without one makes the persisted EventDefinitionEntity lack a resourceName, so Flowable throws this FlowableIllegalArgumentException before building the model.","triggerScenarios":"Building an event model via EventRepositoryService.createEventModelBuilder() (or new EventModelBuilderImpl) and calling deploy() without ever calling resource(name).","commonSituations":"Programmatic event deployment where the developer sets key/payload but forgets resource(); refactored builder code where the resource() call was dropped; dynamic deployment scripts that only set the name for some branches.","solutions":["Call .resource(\"myEvent.event\") on the builder before deploy()","If you only want the model without deployment, use createEventModel()/buildEventModel() instead of deploy()","Add a null/empty check on the resource name in deployment helper code before invoking the builder"],"exampleFix":"// before\neventRepositoryService.createEventModelBuilder()\n    .key(\"orderCreated\")\n    .resourceNameFromString(...)  // model built, but resource never named\n    .deploy();\n// after\neventRepositoryService.createEventModelBuilder()\n    .key(\"orderCreated\")\n    .resource(\"orderCreated.event\")\n    .deploy();","handlingStrategy":"validation","validationCode":"if (resourceName == null || resourceName.isEmpty()) {\n    throw new IllegalArgumentException(\"resource(name) must be called before deploy()\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    builder.deploy();\n} catch (FlowableIllegalArgumentException e) {\n    if (e.getMessage().contains(\"resource name is mandatory\")) { /* fix builder calls */ }\n}","preventionTips":["Wrap builder construction in a helper that always sets resource()","Prefer buildEventModel() when no deployment is intended","Code-review programmatic deployments for the required builder chain: key, resource, deploy"],"tags":["flowable","event-registry","builder","validation"],"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"}