{"record":{"id":"bfffbdb6afeb83b5","repo":"quarkusio/quarkus","slug":"bean-must-be-annotated-with-io-smallrye-common","errorCode":null,"errorMessage":" bean  must be annotated with @io.smallrye.common.annotation.Identifier","messagePattern":" bean  must be annotated with @io\\.smallrye\\.common\\.annotation\\.Identifier","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/signals/deployment/src/main/java/io/quarkus/signals/deployment/SignalsProcessor.java","lineNumber":424,"sourceCode":"                        afterEdges.put(id, List.of(afterValue.asStringArray()));\n                    }\n                }\n            }\n        }\n\n        if (idToBeans.keySet().isEmpty()) {\n            return List.of();\n        }\n        return TopologicalSort.sort(idToBeans.keySet(), beforeEdges, afterEdges, componentTypeName);\n    }\n\n    private static String readIdentifier(BeanInfo bean, String componentTypeName) {\n        if (bean.getTarget().isEmpty()) {\n            throw new IllegalStateException(componentTypeName + \" bean has no target: \" + bean);\n        }\n        Optional<AnnotationInstance> identifier = bean.getQualifier(DotNames.IDENTIFIER);\n        if (identifier.isEmpty()) {\n            throw new IllegalStateException(\n                    componentTypeName + \" bean \" + bean.getBeanClass()\n                            + \" must be annotated with @io.smallrye.common.annotation.Identifier\");\n        }\n        AnnotationValue value = identifier.get().value();\n        if (value == null || value.asString().isBlank()) {\n            throw new IllegalStateException(\n                    componentTypeName + \" bean \" + bean.getBeanClass()\n                            + \" has an @Identifier annotation with an empty value\");\n        }\n        return value.asString();\n    }\n\n    @BuildStep\n    ReceiverExecutorImplementationBuildItem supportedExecutionModels(Capabilities capabilities) {\n        if (capabilities.isPresent(Capability.VERTX)) {\n            return new ReceiverExecutorImplementationBuildItem(VERTX);\n        } else {\n            // Note that quarkus-virtual-threads does require quarkus-vertx,","sourceCodeStart":406,"sourceCodeEnd":442,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/signals/deployment/src/main/java/io/quarkus/signals/deployment/SignalsProcessor.java#L406-L442","documentation":"Component beans (enrichers/interceptors) of the signals SPI must carry @io.smallrye.common.annotation.Identifier so the processor can key and order them. A bean implementing the SPI without that qualifier is rejected at build time.","triggerScenarios":"A bean implements a signals SPI interface but is missing the @Identifier annotation entirely.","commonSituations":"Adding a new enricher/interceptor implementation and forgetting the required @Identifier annotation, or upgrading the extension which newly mandates it.","solutions":["Add @io.smallrye.common.annotation.Identifier(\"unique-id\") to the bean class.","Verify the bean actually implements the intended SPI; if not, remove the accidental implementation.","Give each SPI implementation a distinct identifier string."],"exampleFix":"// before\nclass MyEnricher implements Enricher { ... }\n\n// after\n@Identifier(\"my-enricher\")\nclass MyEnricher implements Enricher { ... }","handlingStrategy":"validation","validationCode":"if (!componentClass.isAnnotationPresent(Identifier.class)) { throw new IllegalStateException(componentClass + \" must be annotated with @Identifier\"); }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always annotate SPI implementations with @Identifier at creation time.","Add an ArchUnit or unit test asserting every Enricher/Interceptor impl carries @Identifier.","Read extension upgrade notes when the annotation becomes mandatory."],"tags":["quarkus","cdi","identifier","missing-annotation"],"backgroundTag":"missing-identifier-annotation","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}