{"record":{"id":"6d43fb074a0c7ebc","repo":"quarkusio/quarkus","slug":"providing-multiple-builtinreaderoverridebuilditem","errorCode":null,"errorMessage":"Providing multiple BuiltInReaderOverrideBuildItem for the same readerClassName is not supported","messagePattern":"Providing multiple BuiltInReaderOverrideBuildItem for the same readerClassName is not supported","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/resteasy-reactive/rest/deployment/src/main/java/io/quarkus/resteasy/reactive/server/deployment/BuiltInReaderOverrideBuildItem.java","lineNumber":36,"sourceCode":"    }\n\n    public String getReaderClassName() {\n        return readerClassName;\n    }\n\n    public String getOverrideClassName() {\n        return overrideClassName;\n    }\n\n    public static Map<String, String> toMap(List<BuiltInReaderOverrideBuildItem> items) {\n        if (items.isEmpty()) {\n            return Collections.emptyMap();\n        }\n        Map<String, String> result = new HashMap<>();\n        for (BuiltInReaderOverrideBuildItem item : items) {\n            String previousOverride = result.put(item.getReaderClassName(), item.getOverrideClassName());\n            if (previousOverride != null) {\n                throw new IllegalStateException(\n                        \"Providing multiple BuiltInReaderOverrideBuildItem for the same readerClassName is not supported\");\n            }\n        }\n        return result;\n    }\n}\n","sourceCodeStart":18,"sourceCodeEnd":43,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/resteasy-reactive/rest/deployment/src/main/java/io/quarkus/resteasy/reactive/server/deployment/BuiltInReaderOverrideBuildItem.java#L18-L43","documentation":"BuiltInReaderOverrideBuildItem.toMap converts the list of built-in message body reader overrides into a map keyed by readerClassName. Because a map can hold only one override per key, providing two or more build items that override the same reader class makes the transformation ambiguous, so an IllegalStateException is thrown. It is a build-time consistency check protecting Quarkus extensions from silently dropping one extension's override.","triggerScenarios":"Two extensions (or two build steps in the same extension) produce BuiltInReaderOverrideBuildItem build items with the same getReaderClassName() value during RESTEasy Reactive server deployment.","commonSituations":"Two Quarkus extensions both overriding e.g. the Jackson or JSON-B built-in reader; an application adding its own override build item that collides with an extension's.","solutions":["Identify which extensions produce the duplicate (search the deployment classpath for BuiltInReaderOverrideBuildItem producers with the same readerClassName).","Remove one of the extensions or one of the producer build steps so only a single override exists per reader class.","If you own both producers, merge them into a single BuiltInReaderOverrideBuildItem or pick a more specific reader class to override."],"exampleFix":"// before: two producers overriding the same reader\n@BuildStep\nBuiltInReaderOverrideBuildItem overrideA() {\n    return new BuiltInReaderOverrideBuildItem(\"com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider\", MyProvider.class.getName());\n}\n@BuildStep // in another extension\nBuiltInReaderOverrideBuildItem overrideB() { /* same readerClassName */ }\n\n// after: single, merged override\n@BuildStep\nBuiltInReaderOverrideBuildItem override() {\n    return new BuiltInReaderOverrideBuildItem(readerClassName, singleOverrideClass);\n}","handlingStrategy":"validation","validationCode":"// CI check: ensure each readerClassName appears in at most one BuiltInReaderOverrideBuildItem producer\nMap<String, Long> dupes = allOverrides.stream()\n    .collect(Collectors.groupingBy(BuiltInReaderOverrideBuildItem::getReaderClassName, Collectors.counting()));\nList<String> conflicts = dupes.entrySet().stream()\n    .filter(e -> e.getValue() > 1).map(Map.Entry::getKey).toList();\nif (!conflicts.isEmpty()) throw new IllegalStateException(\"Duplicate reader overrides: \" + conflicts);","typeGuard":null,"tryCatchPattern":"// Deployment-time failure during augmentation; cannot be caught in app code.\n// Catch it in a build/integration test that runs Quarkus augmentation:\ntry {\n    Quarkus aug = new QuarkusBootstrap(...).setMode(QuarkusBootstrap.Mode.PRODUCTION).run();\n} catch (IllegalStateException e) {\n    if (e.getMessage().contains(\"multiple BuiltInReaderOverrideBuildItem\")) {\n        log.error(\"Two extensions override the same built-in reader\", e);\n    }\n}","preventionTips":["Check dependency extensions for BuiltInReaderOverrideBuildItem producers before adding your own override","Only override a built-in reader class your own extension owns","Merge overrides into a single build item when multiple steps need the same reader"],"tags":["build-time","resteasy-reactive","builditem","conflict"],"backgroundTag":"duplicate-builditem-conflict","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}