{"record":{"id":"2f06ed4790ed9b6c","repo":"quarkusio/quarkus","slug":"reactive-rest-data-panache-does-not-work-with-qua","errorCode":null,"errorMessage":"Reactive REST Data Panache does not work with 'quarkus-resteasy'. Only 'quarkus-rest' extensions are supported","messagePattern":"Reactive REST Data Panache does not work with 'quarkus-resteasy'\\. Only 'quarkus-rest' extensions are supported","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"critical","filePath":"extensions/panache/rest-data-panache/deployment/src/main/java/io/quarkus/rest/data/panache/deployment/RestDataProcessor.java","lineNumber":70,"sourceCode":"                    .produce(new ContainerRequestFilterBuildItem.Builder(SortQueryParamFilter.class.getName())\n                            .setNameBindingNames(Collections.singleton(SortQueryParamValidator.class.getName())).build());\n        }\n    }\n\n    @BuildStep\n    void implementResources(CombinedIndexBuildItem index,\n            List<RestDataResourceBuildItem> resourceBuildItems,\n            List<ResourcePropertiesBuildItem> resourcePropertiesBuildItems,\n            List<BuildTimeConditionBuildItem> buildTimeConditions,\n            Capabilities capabilities,\n            BuildProducer<GeneratedBeanBuildItem> resteasyClassicImplementationsProducer,\n            BuildProducer<GeneratedJaxRsResourceBuildItem> resteasyReactiveImplementationsProducer) {\n\n        boolean isReactivePanache = capabilities.isPresent(Capability.HIBERNATE_REACTIVE);\n        boolean isResteasyClassic = capabilities.isPresent(Capability.RESTEASY);\n\n        if (isReactivePanache && isResteasyClassic) {\n            throw new IllegalStateException(\n                    \"Reactive REST Data Panache does not work with 'quarkus-resteasy'. Only 'quarkus-rest' extensions are supported\");\n        }\n\n        Set<String> excludedClasses = getExcludedClasses(buildTimeConditions);\n        ClassOutput classOutput = isResteasyClassic ? new GeneratedBeanGizmoAdaptor(resteasyClassicImplementationsProducer)\n                : new GeneratedJaxRsResourceGizmoAdaptor(resteasyReactiveImplementationsProducer);\n        JaxRsResourceImplementor jaxRsResourceImplementor = new JaxRsResourceImplementor(capabilities);\n        ResourcePropertiesProvider resourcePropertiesProvider = new ResourcePropertiesProvider(index.getIndex());\n\n        for (RestDataResourceBuildItem resourceBuildItem : resourceBuildItems) {\n            if (!excludedClasses.contains(resourceBuildItem.getResourceMetadata().getResourceName())) {\n                ResourceMetadata resourceMetadata = resourceBuildItem.getResourceMetadata();\n                ResourceProperties resourceProperties = getResourceProperties(resourcePropertiesProvider,\n                        resourceMetadata, resourcePropertiesBuildItems);\n                if (resourceProperties.isHal()) {\n                    if (isResteasyClassic && !hasAnyJsonCapabilityForResteasyClassic(capabilities)) {\n                        throw new IllegalStateException(\"Cannot generate HAL endpoints without \"\n                                + \"either 'quarkus-resteasy-jsonb' or 'quarkus-resteasy-jackson'\");","sourceCodeStart":52,"sourceCodeEnd":88,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/panache/rest-data-panache/deployment/src/main/java/io/quarkus/rest/data/panache/deployment/RestDataProcessor.java#L52-L88","documentation":"RestDataProcessor.implementResources rejects the combination of Hibernate Reactive (reactive REST Data Panache resources) with RESTEasy Classic. Reactive Panache resources return Uni/Multi and require the reactive JAX-RS runtime (quarkus-rest); mixing them with the blocking classic stack is unsupported, so the build fails with IllegalStateException.","triggerScenarios":"Having both io.quarkus:quarkus-hibernate-reactive (or quarkus-reactive-panache-rest-data / reactive REST Data resources) and io.quarkus:quarkus-resteasy on the classpath when building, so isReactivePanache && isResteasyClassic both hold.","commonSituations":"Incremental migration where classic REST dependencies were never removed; including quarkus-resteasy transitively via another extension (e.g. a starter pulling the classic stack); copying dependencies from a classic-based example into a reactive project.","solutions":["Remove io.quarkus:quarkus-resteasy and any quarkus-resteasy-* classic dependencies","Ensure io.quarkus:quarkus-rest is present as the JAX-RS layer","Run mvn dependency:tree -Dincludes=io.quarkus:quarkus-resteasy to find what pulls the classic stack and exclude it there","Switch reactive resources to the RESTEasy Reactive annotations (quarkus-rest) end-to-end"],"exampleFix":"// before (pom.xml)\n<dependency>io.quarkus:quarkus-resteasy</dependency>\n<dependency>io.quarkus:quarkus-hibernate-reactive</dependency>\n\n// after\n<dependency>io.quarkus:quarkus-rest</dependency>\n<dependency>io.quarkus:quarkus-hibernate-reactive</dependency>","handlingStrategy":"validation","validationCode":"// ensure the classic stack is absent in a reactive project:\n// mvn dependency:tree -Dincludes=io.quarkus:quarkus-resteasy\n// expected: no output; if present, add an <exclusion> at the offending dependency","typeGuard":null,"tryCatchPattern":"// build-time failure — no runtime catch is possible;\n// remove quarkus-resteasy or switch to the blocking stack and rebuild","preventionTips":["In reactive applications, exclude/quarantine any transitive quarkus-resteasy dependency","Standardize on quarkus-rest for all new services using Hibernate Reactive","Verify with dependency:tree when adding new extensions that might pull the classic stack","Keep one REST stack per application; document the choice in the team's project template"],"tags":["quarkus","rest-data-panache","hibernate-reactive","incompatible-dependencies","build-time"],"backgroundTag":"incompatible-extension-combination","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"}