{"record":{"id":"b26676ca12e4ad01","repo":"quarkusio/quarkus","slug":"clientexceptionmapper-can-only-take-parameters-of","errorCode":null,"errorMessage":"@ClientExceptionMapper can only take parameters of type 'jakarta.ws.rs.core.Response' or 'java.lang.reflect.Method' Offending instance is '${className}#${methodName}'","messagePattern":"@ClientExceptionMapper can only take parameters of type 'jakarta\\.ws\\.rs\\.core\\.Response' or 'java\\.lang\\.reflect\\.Method' Offending instance is '(.+?)#(.+?)'","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/resteasy-reactive/rest-client/deployment/src/main/java/io/quarkus/rest/client/reactive/deployment/ClientRedirectHandler.java","lineNumber":124,"sourceCode":"        final int finalPriority = priority;\n        gizmo.class_(generatedClassName, cc -> {\n            cc.implements_(ResteasyReactiveResponseRedirectHandler.class);\n            cc.defaultConstructor();\n            cc.method(\"handle\", mc -> {\n                mc.returning(URI.class);\n                ParamVar response = mc.parameter(\"response\", Response.class);\n                mc.body(bc -> {\n                    LinkedHashMap<String, Expr> targetMethodParams = new LinkedHashMap<>();\n                    for (Type paramType : target.parameterTypes()) {\n                        Expr targetMethodParamHandle;\n                        if (paramType.name().equals(ResteasyReactiveDotNames.RESPONSE)) {\n                            targetMethodParamHandle = response;\n                        } else {\n                            String message = DotNames.CLIENT_EXCEPTION_MAPPER + \" can only take parameters of type '\"\n                                    + ResteasyReactiveDotNames.RESPONSE + \"' or '\" + DotNames.METHOD + \"'\"\n                                    + \" Offending instance is '\" + target.declaringClass().name().toString()\n                                    + \"#\" + target.name() + \"'\";\n                            throw new IllegalStateException(message);\n                        }\n                        targetMethodParams.put(paramType.name().toString(), targetMethodParamHandle);\n                    }\n\n                    Expr resultHandle = bc.invokeStatic(methodDescOf(target),\n                            targetMethodParams.values().toArray(new Expr[0]));\n                    bc.return_(resultHandle);\n                });\n            });\n\n            if (finalPriority != Priorities.USER) {\n                cc.method(\"getPriority\", mc -> {\n                    mc.returning(int.class);\n                    mc.body(bc -> {\n                        bc.return_(Const.of(finalPriority));\n                    });\n                });\n            }","sourceCodeStart":106,"sourceCodeEnd":142,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/resteasy-reactive/rest-client/deployment/src/main/java/io/quarkus/rest/client/reactive/deployment/ClientRedirectHandler.java#L106-L142","documentation":"While generating bytecode for an annotated client handler method, each parameter must be assignable from the available locals (the Response or the java.lang.reflect.Method). A parameter of any other type cannot be satisfied, so the build throws this IllegalStateException naming the offending method. (Note: despite the message prefix, this site lives in ClientRedirectHandler's generation code and reports @ClientExceptionMapper misuse.)","triggerScenarios":"Declaring a @ClientExceptionMapper (or redirect handler processed by this generator) static method with a parameter that is neither jakarta.ws.rs.core.Response nor java.lang.reflect.Method.","commonSituations":"Adding convenience parameters like URI, String, or custom DTOs; copying server-side mapper signatures; refactoring that introduced a new parameter without updating generation support.","solutions":["Limit parameters to jakarta.ws.rs.core.Response and/or java.lang.reflect.Method","Derive extra values inside the method body from the Response","Check the @ClientExceptionMapper Javadoc for supported parameter types"],"exampleFix":"// before\n@ClientExceptionMapper\nstatic RuntimeException map(Response r, MyConfig cfg) { ... }\n// after\n@ClientExceptionMapper\nstatic RuntimeException map(Response r) {\n    return new RuntimeException(\"HTTP \" + r.getStatus());\n}","handlingStrategy":"validation","validationCode":"static boolean handlerParamsSupported(Method m) {\n    for (Class<?> p : m.getParameterTypes()) {\n        if (p != jakarta.ws.rs.core.Response.class && p != java.lang.reflect.Method.class) return false;\n    }\n    return true;\n}","typeGuard":null,"tryCatchPattern":"try {\n    handler.generateResponseExceptionMapper(classResult, instance);\n} catch (IllegalStateException e) {\n    if (e.getMessage().contains(\"can only take parameters\")) { /* remove unsupported param */ }\n    throw e;\n}","preventionTips":["Keep mapper parameters limited to Response and Method","Derive any extra values from the Response inside the body","Re-check signatures after refactoring shared mapper utilities"],"tags":["rest-client","exception-mapper","bytecode-generation","build-time"],"backgroundTag":"rest-client-annotation-misuse","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"}