{"record":{"id":"ba7d2ded3ec7ed24","repo":"pinpoint-apm/pinpoint","slug":"unable-to-set-registry-for-servicetypeprovider","errorCode":null,"errorMessage":"Unable to set registry for ServiceTypeProvider","messagePattern":"Unable to set registry for ServiceTypeProvider","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"commons-profiler/src/main/java/com/navercorp/pinpoint/common/profiler/trace/TraceMetadataRegistrar.java","lineNumber":52,"sourceCode":"    private static Field getRegistryField(Class<?> providerClazz, String fieldName) {\n        try {\n            Field registryField = providerClazz.getDeclaredField(fieldName);\n            registryField.setAccessible(true);\n            return registryField;\n        } catch (NoSuchFieldException e) {\n            throw new AssertionError(\"Expected field '\" + fieldName + \"' not found in \" + providerClazz.getName());\n        }\n    }\n\n    private TraceMetadataRegistrar() {\n        throw new AssertionError();\n    }\n\n    public static void registerServiceTypes(ServiceTypeLocator serviceTypeLocator) {\n        try {\n            serviceTypeLocatorField.set(null, serviceTypeLocator);\n        } catch (IllegalAccessException e) {\n            throw new IllegalStateException(\"Unable to set registry for ServiceTypeProvider\", e);\n        }\n    }\n\n    public static void registerAnnotationKeys(AnnotationKeyLocator annotationKeyLocator) {\n        try {\n            annotationKeyLocatorField.set(null, annotationKeyLocator);\n        } catch (IllegalAccessException e) {\n            throw new IllegalStateException(\"Unable to set registry for AnnotationKeyProvider\", e);\n        }\n    }\n}","sourceCodeStart":34,"sourceCodeEnd":63,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/commons-profiler/src/main/java/com/navercorp/pinpoint/common/profiler/trace/TraceMetadataRegistrar.java#L34-L63","documentation":"TraceMetadataRegistrar.registerServiceTypes uses reflection to set a static field inside ServiceTypeProvider (a class initialized before pinpoint's real classpath is built). If the reflective Field.set fails with IllegalAccessException, this IllegalStateException wraps it, meaning the bootstrap reflection setup is broken and service types cannot be resolved.","triggerScenarios":"Calling TraceMetadataRegistrar.registerServiceTypes(...) when the static serviceTypeLocatorField was obtained from a ServiceTypeProvider class that is no longer accessible/settable (field not static, class loaded by an incompatible classloader, or field made final/removed in a different Pinpoint version).","commonSituations":"Bootstrapping pinpoint commons-profiler on JDK 9+ with strong encapsulation blocking reflective access to the class's package; mixing pinpoint versions where TraceMetadataRegistrar and ServiceTypeProvider come from different jars; custom classloader isolation (e.g. in an agent or app server) so the field's declaring class is not accessible to the caller.","solutions":["Ensure TraceMetadataRegistrar and ServiceTypeProvider come from the same pinpoint commons-profiler version (align jar versions on the classpath).","On JDK 9+, add JVM flags to open the package, e.g. --add-opens <module>/<package>=ALL-UNNAMED, or run on the same module setup the library expects.","Check that the class initializing ServiceTypeProvider went through the intended bootstrap path (TraceMetadataRegistrar.registerServiceTypes called exactly once from the correct classloader) before any ServiceType lookup."],"exampleFix":"// before (JDK 9+, IllegalAccessException)\njava -jar app.jar\n// after\njava --add-opens java.base/java.lang=ALL-UNNAMED -cp pinpoint-commons-profiler.jar -jar app.jar","handlingStrategy":"try-catch","validationCode":"// verify same-version jars and reflective access before registering\nboolean ok;\ntry {\n    Class<?> c = Class.forName(\"com.navercorp.pinpoint.common.profiler.trace.ServiceTypeProvider\");\n    Field f = c.getDeclaredField(\"serviceTypeLocator\");\n    f.setAccessible(true);\n    ok = java.lang.reflect.Modifier.isStatic(f.getModifiers());\n} catch (ReflectiveOperationException e) { ok = false; }\nif (!ok) throw new IllegalStateException(\"Pinpoint bootstrap reflection unavailable; check versions/JDK flags\");","typeGuard":null,"tryCatchPattern":"try {\n    TraceMetadataRegistrar.registerServiceTypes(locator);\n} catch (IllegalStateException e) {\n    logger.error(\"Pinpoint metadata bootstrap failed\", e);\n    throw e; // cannot continue without service types\n}","preventionTips":["Keep all pinpoint commons jars at one version.","On JDK 9+ add the required --add-opens flags to the JVM.","Avoid custom classloaders around pinpoint bootstrap classes, or use the same classloader consistently.","Call registerServiceTypes exactly once, early, before any ServiceType lookup."],"tags":["java","reflection","bootstrap","classloader"],"backgroundTag":"module-init-failed","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}