{"record":{"id":"be2b9e8b5fc80e18","repo":"flowable/flowable-engine","slug":"bytes-is-null","errorCode":null,"errorMessage":"bytes is null","messagePattern":"bytes is null","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine/src/main/java/org/flowable/engine/impl/repository/DeploymentBuilderImpl.java","lineNumber":105,"sourceCode":"\n    }\n\n    @Override\n    public DeploymentBuilder addString(String resourceName, String text) {\n        if (text == null) {\n            throw new FlowableIllegalArgumentException(\"text is null\");\n        }\n        ResourceEntity resource = resourceEntityManager.create();\n        resource.setName(resourceName);\n        resource.setBytes(text.getBytes(StandardCharsets.UTF_8));\n        deployment.addResource(resource);\n        return this;\n    }\n\n    @Override\n    public DeploymentBuilder addBytes(String resourceName, byte[] bytes) {\n        if (bytes == null) {\n            throw new FlowableIllegalArgumentException(\"bytes is null\");\n        }\n        ResourceEntity resource = resourceEntityManager.create();\n        resource.setName(resourceName);\n        resource.setBytes(bytes);\n\n        deployment.addResource(resource);\n        return this;\n    }\n\n    @Override\n    public DeploymentBuilder addZipInputStream(ZipInputStream zipInputStream) {\n        try {\n            ZipEntry entry = zipInputStream.getNextEntry();\n            while (entry != null) {\n                if (!entry.isDirectory()) {\n                    String entryName = entry.getName();\n                    byte[] bytes = IoUtil.readInputStream(zipInputStream, entryName);\n                    ResourceEntity resource = resourceEntityManager.create();","sourceCodeStart":87,"sourceCodeEnd":123,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine/src/main/java/org/flowable/engine/impl/repository/DeploymentBuilderImpl.java#L87-L123","documentation":"Flowable's DeploymentBuilder.addBytes attaches a raw byte array as a deployment resource. It throws FlowableIllegalArgumentException when the byte array is null, since a resource must have content to persist. This is a simple argument validation guard.","triggerScenarios":"Calling deploymentBuilder.addBytes(resourceName, null); passing a byte[] returned from a failed read/encode step (e.g. Files.readAllBytes failed upstream, Base64 decode of a null property).","commonSituations":"Loading model files from disk or database where the fetch returned null; externalized configuration that did not resolve; frameworks injecting optional byte content that is absent in the target environment.","solutions":["Check the byte array for null before calling addBytes.","Fix the upstream producer of the bytes (file read, decode, service call) so it returns actual content or fails with a clear error.","If the resource is genuinely optional, skip calling addBytes instead of passing null."],"exampleFix":"// before\nbyte[] modelBytes = readModelBytes(name); // may be null\nrepositoryService.createDeployment().addBytes(name, modelBytes).deploy();\n// after\nbyte[] modelBytes = readModelBytes(name);\nif (modelBytes != null) {\n    repositoryService.createDeployment().addBytes(name, modelBytes).deploy();\n} else {\n    throw new IllegalStateException(\"Model bytes missing for \" + name);\n}","handlingStrategy":"validation","validationCode":"if (bytes == null || bytes.length == 0) throw new IllegalArgumentException(\"resource bytes for \" + resourceName + \" missing\");","typeGuard":"boolean hasContent(byte[] b) { return b != null && b.length > 0; }","tryCatchPattern":"try {\n    builder.addBytes(name, bytes).deploy();\n} catch (FlowableIllegalArgumentException e) {\n    log.error(\"addBytes rejected null content for {}\", name);\n    throw e;\n}","preventionTips":["Validate byte-producing reads (files, DB blobs) before adding resources.","Treat null byte arrays from upstream as errors, not empty deployments.","Skip optional resources explicitly instead of passing null."],"tags":["java","flowable","deployment","null-check","validation"],"backgroundTag":"null-argument","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"}