{"record":{"id":"02dcd0adbbb94b59","repo":"quarkusio/quarkus","slug":"found-d-defaultsecuritycheckbuilditem-items-plea","errorCode":null,"errorMessage":"Found %d DefaultSecurityCheckBuildItem items, please make sure the item is produced exactly once","messagePattern":"Found (.+?) DefaultSecurityCheckBuildItem items, please make sure the item is produced exactly once","errorType":"exception","errorClass":"java.lang.IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/security/deployment/src/main/java/io/quarkus/security/deployment/SecurityProcessor.java","lineNumber":991,"sourceCode":"            List<DefaultSecurityCheckBuildItem> defaultSecurityCheckBuildItem) {\n        classPredicate.produce(new ApplicationClassPredicateBuildItem(new SecurityCheckStorageAppPredicate()));\n\n        RuntimeValue<SecurityCheckStorageBuilder> builder = recorder.newBuilder();\n        for (Map.Entry<MethodInfo, SecurityCheck> methodEntry : securityChecksItem.securityChecks.entrySet().stream()\n                .sorted(Map.Entry.comparingByKey(Comparator.comparing(MethodInfo::toString))).toList()) {\n            MethodInfo method = methodEntry.getKey();\n            String[] params = new String[method.parametersCount()];\n            for (int i = 0; i < method.parametersCount(); ++i) {\n                params[i] = method.parameterType(i).name().toString();\n            }\n            recorder.addMethod(builder, method.declaringClass().name().toString(), method.name(), params,\n                    methodEntry.getValue());\n        }\n\n        if (!defaultSecurityCheckBuildItem.isEmpty()) {\n            if (defaultSecurityCheckBuildItem.size() > 1) {\n                int itemCount = defaultSecurityCheckBuildItem.size();\n                throw new IllegalStateException(\"Found %d DefaultSecurityCheckBuildItem items, \".formatted(itemCount)\n                        + \"please make sure the item is produced exactly once\");\n            }\n\n            var roles = defaultSecurityCheckBuildItem.get(0).getRolesAllowed();\n            if (roles == null) {\n                recorder.registerDefaultSecurityCheck(builder, recorder.denyAll());\n            } else {\n                recorder.registerDefaultSecurityCheck(builder, recorder.rolesAllowed(roles.toArray(new String[0])));\n            }\n        }\n        syntheticBeans.produce(\n                SyntheticBeanBuildItem.configure(SecurityCheckStorage.class)\n                        .scope(ApplicationScoped.class)\n                        .unremovable()\n                        .runtimeProxy(recorder.create(builder))\n                        .done());\n    }\n","sourceCodeStart":973,"sourceCodeEnd":1009,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/security/deployment/src/main/java/io/quarkus/security/deployment/SecurityProcessor.java#L973-L1009","documentation":"DefaultSecurityCheckBuildItem is a singleton build item: the security build expects exactly zero or one producer so the default security check (e.g. deny-all/permit behavior) is unambiguous. When more than one DefaultSecurityCheckBuildItem is found during build, the build fails telling the producer to ensure it is produced exactly once.","triggerScenarios":"Multiple @BuildStep methods (often across custom extensions or copy-pasted integration code) each produce a DefaultSecurityCheckBuildItem in the same application build.","commonSituations":"Adding a custom security extension that produces the item while another (or Quarkus itself) already produces it; copy-pasting a build step from another module; merging extensions that both install a default check.","solutions":["Find all @BuildStep methods producing DefaultSecurityCheckBuildItem and keep only one.","Guard additional producers with a condition (e.g. only produce when none exists) or merge them into a single build step.","Remove any custom extension code that duplicates Quarkus's built-in default security check production."],"exampleFix":"// before\n@BuildItem\nDefaultSecurityCheckBuildItem a() { ... } // in two extensions\n\n// after\n// produce it in exactly one build step, or make the second conditional:\n@BuildStep(onlyIf = IsDefaultCheckMissing.class)\nDefaultSecurityCheckBuildItem b() { ... }","handlingStrategy":"validation","validationCode":"// audit build steps producing the item before adding new ones\n// search codebase: grep -rn \"DefaultSecurityCheckBuildItem\" extensions/ integration-tests/","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Produce singleton build items in exactly one place","Conditionally guard additional producers","Search the codebase before adding a new producer"],"tags":["quarkus","security","build-item","duplicate"],"backgroundTag":"duplicate-build-item","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"}