{"record":{"id":"9d7c8bc86e345392","repo":"quarkusio/quarkus","slug":"jakarta-ws-rs-ext-exceptionmapper-are-not-suppor","errorCode":null,"errorMessage":"`jakarta.ws.rs.ext.ExceptionMapper` are not supported in REST Client Reactive","messagePattern":"`jakarta\\.ws\\.rs\\.ext\\.ExceptionMapper` are not supported in REST Client Reactive","errorType":"exception","errorClass":"java.lang.UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"independent-projects/resteasy-reactive/client/runtime/src/main/java/org/jboss/resteasy/reactive/client/impl/ProvidersImpl.java","lineNumber":51,"sourceCode":"        return null;\n    }\n\n    @Override\n    public <T> MessageBodyWriter<T> getMessageBodyWriter(Class<T> type, Type genericType, Annotation[] annotations,\n            MediaType mediaType) {\n        List<MessageBodyWriter<?>> writers = context.getRestClient().getClientContext().getSerialisers()\n                .findWriters(context.getConfiguration(), type, mediaType, RuntimeType.CLIENT);\n        for (MessageBodyWriter<?> writer : writers) {\n            if (writer.isWriteable(type, genericType, annotations, mediaType)) {\n                return (MessageBodyWriter<T>) writer;\n            }\n        }\n        return null;\n    }\n\n    @Override\n    public <T extends Throwable> ExceptionMapper<T> getExceptionMapper(Class<T> type) {\n        throw new UnsupportedOperationException(\n                \"`jakarta.ws.rs.ext.ExceptionMapper` are not supported in REST Client Reactive\");\n    }\n\n    @Override\n    public <T> ContextResolver<T> getContextResolver(Class<T> contextType, MediaType mediaType) {\n        // TODO: support getting context resolver by mediaType (which is provided using the `@Produces` annotation).\n        return context.getConfiguration().getContextResolver(contextType);\n    }\n}\n","sourceCodeStart":33,"sourceCodeEnd":61,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/independent-projects/resteasy-reactive/client/runtime/src/main/java/org/jboss/resteasy/reactive/client/impl/ProvidersImpl.java#L33-L61","documentation":"REST Client Reactive throws this UnsupportedOperationException because jakarta.ws.rs.ext.ExceptionMapper does not fit the reactive client's execution model: response errors are surfaced as failures on the returned Uni/Multi rather than routed through mapper beans. ProvidersImpl therefore rejects getExceptionMapper outright.","triggerScenarios":"Calling providers.getExceptionMapper(SomeException.class) on the client's Providers instance — usually from a ReaderInterceptor, WriterInterceptor, or custom message body worker that resolves via ContextProviders/ProvidersImpl.exceptionMapper().","commonSituations":"Migrating a server-side provider or a classic RESTEasy client interceptor to the reactive client and expecting ExceptionMapper support; shared library code that calls getExceptionMapper unconditionally.","solutions":["Handle errors on the Uni/Multi returned by the client with .onFailure().recoverWith... instead of an ExceptionMapper","Remove the getExceptionMapper call and process Response/Throwable in a ClientResponseFilter or in the subscription's onFailure callback","If shared code needs a mapper, feature-detect with try/catch around UnsupportedOperationException"],"exampleFix":"// before\nExceptionMapper<FooException> m = providers.getExceptionMapper(FooException.class);\n// after\nuni.onFailure(FooException.class, ex -> mapIt(ex)).subscribe().with(...)","handlingStrategy":"try-catch","validationCode":"ExceptionMapper<?> mapper = null;\ntry {\n    mapper = providers.getExceptionMapper(type);\n} catch (UnsupportedOperationException ignored) {\n    // reactive client: handle via Uni/Multi onFailure instead\n}","typeGuard":"boolean supportsExceptionMappers(Providers p) {\n    return !(p instanceof org.jboss.resteasy.reactive.client.impl.ProvidersImpl);\n}","tryCatchPattern":"try {\n    return providers.getExceptionMapper(type);\n} catch (UnsupportedOperationException e) {\n    log.warn(\"ExceptionMapper unsupported in REST Client Reactive; use onFailure on Uni/Multi\");\n    return null;\n}","preventionTips":["Handle client errors with .onFailure().recoverWith... on the returned Uni/Multi","Use ClientResponseFilter for response-level error handling in reactive clients","Do not port server-side ExceptionMapper patterns to the reactive client"],"tags":["rest-client-reactive","exception-mapper","unsupported-operation"],"backgroundTag":"exception-mapper-unsupported","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"}