{"record":{"id":"a016ef356970723b","repo":"halo-dev/halo","slug":"the-metadata-generatename-must-not-be-blank-when-m","errorCode":null,"errorMessage":"The metadata.generateName must not be blank when metadata.name is blank","messagePattern":"The metadata\\.generateName must not be blank when metadata\\.name is blank","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"application/src/main/java/run/halo/app/extension/ReactiveExtensionClientImpl.java","lineNumber":242,"sourceCode":"    }\n\n    @Override\n    public Mono<JsonExtension> getJsonExtension(GroupVersionKind gvk, String name) {\n        return fetchJsonExtension(gvk, name).switchIfEmpty(Mono.error(() -> new ExtensionNotFoundException(gvk, name)));\n    }\n\n    @Override\n    public <E extends Extension> Mono<E> create(E extension) {\n        return Mono.fromCallable(() -> {\n                    var metadata = extension.getMetadata();\n                    // those fields should be managed by halo.\n                    metadata.setCreationTimestamp(Instant.now());\n                    metadata.setDeletionTimestamp(null);\n                    metadata.setVersion(null);\n\n                    if (!hasText(metadata.getName())) {\n                        if (!hasText(metadata.getGenerateName())) {\n                            throw new IllegalArgumentException(\n                                    \"The metadata.generateName must not be blank when metadata.name is \" + \"blank\");\n                        }\n\n                        // generate name with random text\n                        metadata.setName(metadata.getGenerateName()\n                                + secure().nextAlphanumeric(GENERATE_NAME_RANDOM_LENGTH)\n                                        // Prevent data conflicts caused by database case sensitivity\n                                        .toLowerCase());\n                    }\n                    extension.setMetadata(metadata);\n                    return converter.convertTo(extension);\n                })\n                .subscribeOn(this.scheduler)\n                // the method secureStrong() may invoke blocking SecureRandom, so we need to subscribe\n                // on boundedElastic thread pool.\n                .flatMap(extStore -> doCreate(extension, extStore.getName(), extStore.getData()))\n                .flatMap(created -> Mono.fromCallable(() -> {\n                            watchers.onAdd(convertToRealExtension(created));","sourceCodeStart":224,"sourceCodeEnd":260,"githubUrl":"https://github.com/halo-dev/halo/blob/d2f5165f9c8f055ffcb3fa9c3f4032821a7b68c8/application/src/main/java/run/halo/app/extension/ReactiveExtensionClientImpl.java#L224-L260","documentation":"Thrown as an IllegalArgumentException from ReactiveExtensionClientImpl.create when an Extension's metadata has neither a non-blank name nor a non-blank generateName. Halo requires at least one: a concrete name, or a generateName prefix it can append a random suffix to. With both blank it cannot form a unique store name.","triggerScenarios":"client.create(extension) where extension.getMetadata() has name blank AND generateName blank — e.g. a freshly constructed Extension with an empty/absent Metadata, or a Metadata where both fields were explicitly cleared.","commonSituations":"Developer builds an Extension and forgets to set Metadata or its name/generateName; plugin constructs a resource expecting auto-naming but did not set generateName; copy of a template object whose metadata was stripped; null metadata.","solutions":["Set metadata.name to a concrete DNS-subdomain-safe value before create, OR set metadata.generateName to a prefix so Halo appends a random suffix.","Always attach a Metadata object to the Extension before calling create.","If auto-naming is desired, use generateName (e.g. 'my-resource-') and read back the assigned name from the returned object."],"exampleFix":"// before:\n//   var ext = new MyExtension();\n//   ext.setMetadata(new Metadata()); // both name and generateName blank\n//   client.create(ext);\n// after:\n//   var meta = new Metadata();\n//   meta.setGenerateName(\"my-resource-\");\n//   ext.setMetadata(meta);\n//   client.create(ext);","handlingStrategy":"validation","validationCode":"// ensure name or generateName is set before create\nMetadata meta = extension.getMetadata();\nif (meta == null) {\n    meta = new Metadata();\n    extension.setMetadata(meta);\n}\nif (!StringUtils.hasText(meta.getName())\n    && !StringUtils.hasText(meta.getGenerateName())) {\n    meta.setGenerateName(\"res-\"); // or set a concrete name\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always attach a Metadata with either name or generateName before calling client.create.","Use generateName when you want Halo to auto-generate a unique name."],"tags":["extension","metadata","validation","create","naming"],"backgroundTag":null,"analyzedSha":"d2f5165f9c8f055ffcb3fa9c3f4032821a7b68c8","analyzedAt":"2026-08-14T00:18:38.915Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}