{"record":{"id":"7ee62a4e381831b5","repo":"quarkusio/quarkus","slug":"not-a-global-provider","errorCode":null,"errorMessage":"Not a global provider: ","messagePattern":"Not a global provider: ","errorType":"exception","errorClass":"java.lang.IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/qute/runtime/src/main/java/io/quarkus/qute/runtime/EngineProducer.java","lineNumber":380,"sourceCode":"                    .getContextClassLoader().loadClass(resolverClassName);\n            if (Resolver.class.isAssignableFrom(resolverClazz)) {\n                return (Resolver) resolverClazz.getDeclaredConstructor().newInstance();\n            }\n            throw new IllegalStateException(\"Not a resolver: \" + resolverClassName);\n        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | IllegalArgumentException\n                | InvocationTargetException | NoSuchMethodException | SecurityException e) {\n            throw new IllegalStateException(\"Unable to create resolver: \" + resolverClassName, e);\n        }\n    }\n\n    private TemplateGlobalProvider createGlobalProvider(String initializerClassName) {\n        try {\n            Class<?> initializerClazz = Thread.currentThread()\n                    .getContextClassLoader().loadClass(initializerClassName);\n            if (TemplateGlobalProvider.class.isAssignableFrom(initializerClazz)) {\n                return (TemplateGlobalProvider) initializerClazz.getDeclaredConstructor().newInstance();\n            }\n            throw new IllegalStateException(\"Not a global provider: \" + initializerClazz);\n        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | IllegalArgumentException\n                | InvocationTargetException | NoSuchMethodException | SecurityException e) {\n            throw new IllegalStateException(\"Unable to create global provider: \" + initializerClassName, e);\n        }\n    }\n\n    private boolean isExcluded(String path) {\n        for (Pattern p : templatePathExcludes) {\n            if (p.matcher(path).matches()) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    private Optional<TemplateLocation> locate(String path) {\n        if (isExcluded(path)) {\n            return Optional.empty();","sourceCodeStart":362,"sourceCodeEnd":398,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/qute/runtime/src/main/java/io/quarkus/qute/runtime/EngineProducer.java#L362-L398","documentation":"EngineProducer.createGlobalProvider loads the class configured via quarkus.qute.global-provider.<n>.classes and verifies it implements io.quarkus.qute.TemplateGlobalProvider. If it loads but does not, startup fails with this error. Note the message appends the loaded Class object, so it prints class <FQN> rather than the raw config string.","triggerScenarios":"Setting quarkus.qute.global-provider.<n>.classes to a class that exists but does not implement TemplateGlobalProvider (e.g. mistakenly pointing it at a Resolver or a plain bean).","commonSituations":"Confusing the resolver and global-provider config keys; renaming/refactoring a class so it no longer implements the interface; copying config from an example with a different class.","solutions":["Make the configured class implement io.quarkus.qute.TemplateGlobalProvider with a public no-arg constructor.","Fix the quarkus.qute.global-provider.<n>.classes property to the correct FQN.","Remove the property if you provide globals another way (e.g. @TemplateGlobal annotated classes need no config)."],"exampleFix":"// before\nquarkus.qute.global-provider.g.classes=com.example.SomeResolver\n// after\nquarkus.qute.global-provider.g.classes=com.example.MyGlobals // implements TemplateGlobalProvider","handlingStrategy":"validation","validationCode":"Class<?> c = Class.forName(\"com.example.MyGlobals\");\nif (!io.quarkus.qute.TemplateGlobalProvider.class.isAssignableFrom(c)) throw new IllegalArgumentException(\"Not a TemplateGlobalProvider\");","typeGuard":"boolean isGlobalProvider(Class<?> c) { return io.quarkus.qute.TemplateGlobalProvider.class.isAssignableFrom(c); }","tryCatchPattern":"try { app.start(); } catch (IllegalStateException e) { if (e.getMessage().contains(\"Not a global provider\")) { /* fix quarkus.qute.global-provider config */ } else throw e; }","preventionTips":["Prefer @TemplateGlobal annotated classes over manual config","Don't mix up resolver vs global-provider config keys","Verify the class still implements the interface after refactors"],"tags":["qute","reflection","configuration"],"backgroundTag":"class-does-not-implement-interface","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"}