{"record":{"id":"b0b80161bc5a2ef9","repo":"quarkusio/quarkus","slug":"different-default-scopes-defined-for-additional-be","errorCode":null,"errorMessage":"Different default scopes defined for additional bean class: <beanClass>\n\t - scopes: <defaultScope> and <existingDefaultScope>","messagePattern":"Different default scopes defined for additional bean class: <beanClass>\n\t - scopes: <defaultScope> and <existingDefaultScope>","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/ArcProcessor.java","lineNumber":193,"sourceCode":"            Optional<TestClassPredicateBuildItem> testClassPredicate,\n            Capabilities capabilities,\n            CustomScopeAnnotationsBuildItem customScopes,\n            LaunchModeBuildItem launchModeBuildItem,\n            BuildProducer<CompletedApplicationClassPredicateBuildItem> applicationClassPredicateProducer) {\n\n        if (!arcConfig.isRemoveUnusedBeansFieldValid()) {\n            throw new IllegalArgumentException(\"Invalid configuration value set for 'quarkus.arc.remove-unused-beans'.\" +\n                    \" Please use one of \" + ArcConfig.ALLOWED_REMOVE_UNUSED_BEANS_VALUES);\n        }\n\n        // bean type -> default scope (may be null)\n        Map<String, DotName> additionalBeanTypes = new HashMap<>();\n        for (AdditionalBeanBuildItem additionalBean : additionalBeans) {\n            DotName defaultScope = additionalBean.getDefaultScope();\n            for (String beanClass : additionalBean.getBeanClasses()) {\n                DotName existingDefaultScope = additionalBeanTypes.get(beanClass);\n                if (existingDefaultScope != null && defaultScope != null && !existingDefaultScope.equals(defaultScope)) {\n                    throw new IllegalStateException(\"Different default scopes defined for additional bean class: \" + beanClass\n                            + \"\\n\\t - scopes: \" + defaultScope + \" and \"\n                            + existingDefaultScope);\n                }\n                additionalBeanTypes.put(beanClass, defaultScope);\n            }\n        }\n\n        Set<DotName> generatedClassNames = beanArchiveIndex.getGeneratedClassNames();\n        IndexView index = beanArchiveIndex.getIndex();\n        BeanProcessor.Builder builder = BeanProcessor.builder();\n        IndexView applicationClassesIndex = applicationIndex.getIndex();\n        Predicate<DotName> applicationClassPredicate = new AbstractCompositeApplicationClassesPredicate<DotName>(\n                applicationClassesIndex, generatedClassNames, applicationClassPredicates, testClassPredicate) {\n            @Override\n            protected DotName getDotName(DotName dotName) {\n                return dotName;\n            }\n        };","sourceCodeStart":175,"sourceCodeEnd":211,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/ArcProcessor.java#L175-L211","documentation":"Two or more AdditionalBeanBuildItem contributions assign different default scopes to the same bean class. The ArcProcessor builds a map of bean class -> default scope during initialize() and detects the conflict as an IllegalStateException.","triggerScenarios":"Registering the same class via two AdditionalBeanBuildItem calls with different @DefaultScope/defaultScope values, e.g. one extension adds Foo with @ApplicationScoped default and another adds Foo with @Singleton default.","commonSituations":"Two extensions both registering a shared library bean with different scopes; an application adding an additional bean that a dependency extension already registers with a different default scope; refactors that duplicate registrations.","solutions":["Remove one of the duplicate AdditionalBeanBuildItem registrations for the class","Align the default scopes so both registrations agree","Annotate the bean class directly with its scope instead of using additional beans"],"exampleFix":"// before\nAdditionalBeanBuildItem.builder().addBeanClasses(\"com.acme.Foo\").setDefaultScope(ApplicationScoped.class).build();\nAdditionalBeanBuildItem.builder().addBeanClasses(\"com.acme.Foo\").setDefaultScope(Singleton.class).build();\n// after\nAdditionalBeanBuildItem.builder().addBeanClasses(\"com.acme.Foo\").setDefaultScope(ApplicationScoped.class).build();","handlingStrategy":"validation","validationCode":"Map<String,String> seen = new HashMap<>();\nfor (AdditionalBeanBuildItem b : items)\n    for (String cls : b.getBeanClasses()) {\n        String prev = seen.put(cls, String.valueOf(b.getDefaultScope()));\n        if (prev != null && !prev.equals(String.valueOf(b.getDefaultScope()))) throw new IllegalStateException(\"Scope conflict for \" + cls);\n    }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep additional-bean registration in one place per class","Annotate the bean class directly instead of multiple registrations","Log all AdditionalBeanBuildItems in a debug build step"],"tags":["quarkus","arc","build-time","bean-registration"],"backgroundTag":"conflicting-bean-registration","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}