{"record":{"id":"744aa5e376436e04","repo":"quarkusio/quarkus","slug":"method-info-name-of-class-info-declaringc","errorCode":null,"errorMessage":"Method '${info.name()} of class '${info.declaringClass().name()}' cannot be private as it is annotated with '@jakarta.ws.rs.ext.Provider'","messagePattern":"Method '(.+?) of class '(.+?)' cannot be private as it is annotated with '@jakarta\\.ws\\.rs\\.ext\\.Provider'","errorType":"validation","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"independent-projects/resteasy-reactive/server/processor/src/main/java/org/jboss/resteasy/reactive/server/processor/generation/exceptionmappers/ServerExceptionMapperGenerator.java","lineNumber":640,"sourceCode":"            return ReturnType.REST_RESPONSE;\n        } else if (targetMethod.returnType().kind() == Type.Kind.PARAMETERIZED_TYPE) {\n            ParameterizedType parameterizedType = targetMethod.returnType().asParameterizedType();\n            if (parameterizedType.name().equals(UNI) && (parameterizedType.arguments().size() == 1)) {\n                if (parameterizedType.arguments().get(0).name().equals(RESPONSE)) {\n                    return ReturnType.UNI_RESPONSE;\n                }\n                if (parameterizedType.arguments().get(0).name().equals(REST_RESPONSE)) {\n                    return ReturnType.UNI_REST_RESPONSE;\n                }\n            }\n        }\n        throw new RuntimeException(\"Method '\" + targetMethod.name() + \" of class '\" + targetMethod.declaringClass().name()\n                + \"' cannot be used as an exception mapper as it does not declare 'Response' or 'Uni<Response>' or as its return type\");\n    }\n\n    private static void checkModifiers(MethodInfo info) {\n        if ((info.flags() & Modifier.PRIVATE) != 0) {\n            throw new RuntimeException(\"Method '\" + info.name() + \" of class '\" + info.declaringClass().name()\n                    + \"' cannot be private as it is annotated with '@\" + SERVER_EXCEPTION_MAPPER\n                    + \"'\");\n        }\n        if ((info.flags() & Modifier.STATIC) != 0) {\n            throw new RuntimeException(\"Method '\" + info.name() + \" of class '\" + info.declaringClass().name()\n                    + \"' cannot be static as it is annotated with '@\" + SERVER_EXCEPTION_MAPPER\n                    + \"'\");\n        }\n    }\n\n    private static String getGeneratedClassName(MethodInfo targetMethod, Type handledExceptionType) {\n        return targetMethod.declaringClass().name() + \"$ExceptionMapper$\"\n                + HashUtil.sha1(targetMethod.name() + handledExceptionType.name().toString());\n    }\n\n    private enum ReturnType {\n        RESPONSE,\n        REST_RESPONSE,","sourceCodeStart":622,"sourceCodeEnd":658,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/independent-projects/resteasy-reactive/server/processor/src/main/java/org/jboss/resteasy/reactive/server/processor/generation/exceptionmappers/ServerExceptionMapperGenerator.java#L622-L658","documentation":"checkModifiers in ServerExceptionMapperGenerator rejects exception mapper methods declared private. A method annotated with @jakarta.ws.rs.ext.Provider (or @ServerExceptionMapper) must be non-private because the generated filter/interceptor code invokes it reflectively/via bytecode generated at build time, which requires accessible methods.","triggerScenarios":"A method carrying @ServerExceptionMapper or @Provider whose flags include Modifier.PRIVATE, detected during build-time generation of the exception mapper class.","commonSituations":"Keeping mapper methods private inside a resource or provider class, IDE auto-generating the method as private, or narrowing visibility during refactoring.","solutions":["Change the mapper method from private to at least package-private (recommended: public)","Move the mapper to a dedicated @Provider class if visibility was intentional","Remove the @Provider/@ServerExceptionMapper annotation if the method is not a mapper"],"exampleFix":"// before\n@ServerExceptionMapper\nprivate Response map(NotFoundException e) { ... }\n\n// after\n@ServerExceptionMapper\npublic Response map(NotFoundException e) { ... }","handlingStrategy":"validation","validationCode":"java.lang.reflect.Method m = ...; // annotated mapper\nif (java.lang.reflect.Modifier.isPrivate(m.getModifiers())) {\n    throw new IllegalStateException(\"@ServerExceptionMapper methods must not be private: \" + m);\n}\n","typeGuard":"static boolean isAccessibleMapper(java.lang.reflect.Method m) {\n    return !java.lang.reflect.Modifier.isPrivate(m.getModifiers());\n}\n","tryCatchPattern":null,"preventionTips":["Declare exception mapper methods public by default","Avoid IDE 'encapsulate' refactors on annotated methods","Code-review visibility changes in classes containing @ServerExceptionMapper"],"tags":["quarkus","resteasy-reactive","visibility","exception-mapper"],"backgroundTag":"invalid-exception-mapper-signature","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"}