{"record":{"id":"7082aa2e05281b67","repo":"quarkusio/quarkus","slug":"cannot-generate-hal-endpoints-without-either-quar","errorCode":null,"errorMessage":"Cannot generate HAL endpoints without either 'quarkus-resteasy-jsonb' or 'quarkus-resteasy-jackson'","messagePattern":"Cannot generate HAL endpoints without either 'quarkus-resteasy-jsonb' or 'quarkus-resteasy-jackson'","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/panache/rest-data-panache/deployment/src/main/java/io/quarkus/rest/data/panache/deployment/RestDataProcessor.java","lineNumber":87,"sourceCode":"        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'\");\n                    } else if (!isResteasyClassic && !hasAnyJsonCapabilityForResteasyReactive(capabilities)) {\n                        throw new IllegalStateException(\"Cannot generate HAL endpoints without \"\n                                + \"either 'quarkus-rest-jsonb' or 'quarkus-rest-jackson'\");\n                    }\n\n                }\n                if (resourceProperties.isExposed()) {\n                    jaxRsResourceImplementor.implement(classOutput, resourceMetadata, resourceProperties, capabilities);\n                }\n            }\n        }\n    }\n\n    private ResourceProperties getResourceProperties(ResourcePropertiesProvider resourcePropertiesProvider,\n            ResourceMetadata resourceMetadata, List<ResourcePropertiesBuildItem> resourcePropertiesBuildItems) {\n        for (ResourcePropertiesBuildItem resourcePropertiesBuildItem : resourcePropertiesBuildItems) {\n            if (resourcePropertiesBuildItem.getResourceType().equals(resourceMetadata.getResourceClass())","sourceCodeStart":69,"sourceCodeEnd":105,"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#L69-L105","documentation":"During deployment, Quarkus REST Data with Panache generates JAX-RS resource methods. When HAL (hypertext application language) endpoints are requested (resourceProperties.isHal()), the processor requires a JSON serializer extension present, because HAL responses are produced by the JSON provider. If RESTEasy Classic is detected and neither quarkus-resteasy-jsonb nor quarkus-resteasy-jackson is on the classpath, the build fails with this IllegalStateException.","triggerScenarios":"Build time: a Panache resource is exposed with HAL enabled (e.g. @ResourceProperties(hal = true) or quarkus.rest-data-panache... hal config) while the application uses RESTEasy Classic and has no RESTEasy Classic JSON provider (quarkus-resteasy-jsonb or quarkus-resteasy-jackson) among its capabilities.","commonSituations":"Developer adds a REST Data Panache resource with HAL links enabled but only pulled in quarkus-resteasy (no JSON mapper); app was migrated to/from RESTEasy Reactive leaving the wrong JSON extension set; missing the quarkus-resteasy-jackson dependency after removing quarkus-hibernate-orm-panache which used to pull it transitively.","solutions":["Add io.quarkus:quarkus-resteasy-jackson (or quarkus-resteasy-jsonb) to the pom.xml/build.gradle dependencies.","If the app is RESTEasy Reactive, instead add quarkus-rest-jackson (or quarkus-rest-jsonb).","Disable HAL generation for the resource (remove hal=true) if HAL links are not needed."],"exampleFix":"// before (pom.xml): only classic REST + panache rest-data\n<dependency>io.quarkus:quarkus-resteasy</dependency>\n// after\n<dependency>io.quarkus:quarkus-resteasy</dependency>\n<dependency>io.quarkus:quarkus-resteasy-jackson</dependency>","handlingStrategy":"validation","validationCode":"// pom.xml / build check before building\nboolean classic = hasDependency(\"io.quarkus:quarkus-resteasy\");\nboolean ok = classic\n    ? hasDependency(\"io.quarkus:quarkus-resteasy-jackson\") || hasDependency(\"io.quarkus:quarkus-resteasy-jsonb\")\n    : hasDependency(\"io.quarkus:quarkus-rest-jackson\") || hasDependency(\"io.quarkus:quarkus-rest-jsonb\");\nif (!ok) throw new IllegalStateException(\"HAL endpoints need a RESTEasy JSON extension\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always pair rest-data-panache with a JSON extension (jackson preferred).","Check the dependency tree (mvn dependency:tree | grep -E 'resteasy-jackson|rest-jackson') after upgrading Quarkus.","Only enable hal=true when a JSON provider is present.","Match the JSON extension flavor to your REST stack (classic vs reactive)."],"tags":["quarkus","build-time","rest-data-panache","hal","missing-dependency"],"backgroundTag":"missing-extension-dependency","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"}