{"record":{"id":"35bbd01acecff01f","repo":"quarkusio/quarkus","slug":"failed-to-instantiate-provider-componentclass","errorCode":null,"errorMessage":"Failed to instantiate provider \" + componentClass + \". Does it have a public no-arg constructor?","messagePattern":"Failed to instantiate provider \" \\+ componentClass \\+ \"\\. Does it have a public no-arg constructor\\?","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"extensions/resteasy-reactive/rest-client/runtime/src/main/java/io/quarkus/rest/client/reactive/runtime/RestClientBuilderImpl.java","lineNumber":470,"sourceCode":"    public RestClientBuilderImpl register(Object component, Map<Class<?>, Integer> contracts) {\n        registerMpSpecificProvider(component);\n        clientBuilder.register(component, contracts);\n        return this;\n    }\n\n    @Override\n    public RestClientBuilderImpl baseUri(URI uri) {\n        this.uri = uri;\n        return this;\n    }\n\n    private void registerMpSpecificProvider(Class<?> componentClass) {\n        if (ResponseExceptionMapper.class.isAssignableFrom(componentClass)\n                || ParamConverterProvider.class.isAssignableFrom(componentClass)) {\n            try {\n                registerMpSpecificProvider(componentClass.getDeclaredConstructor().newInstance());\n            } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {\n                throw new IllegalArgumentException(\"Failed to instantiate provider \" + componentClass\n                        + \". Does it have a public no-arg constructor?\", e);\n            }\n        }\n    }\n\n    private void registerMpSpecificProvider(Object component) {\n        if (component instanceof ResponseExceptionMapper) {\n            exceptionMappers.add((ResponseExceptionMapper<?>) component);\n        }\n        if (component instanceof ParamConverterProvider) {\n            paramConverterProviders.add((ParamConverterProvider) component);\n        }\n    }\n\n    @Override\n    public RestClientBuilderImpl queryParamStyle(final QueryParamStyle style) {\n        queryParamStyle = style;\n        return this;","sourceCodeStart":452,"sourceCodeEnd":488,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/resteasy-reactive/rest-client/runtime/src/main/java/io/quarkus/rest/client/reactive/runtime/RestClientBuilderImpl.java#L452-L488","documentation":"When registering a provider class, registerMpSpecificProvider instantiates MP-specific providers (ResponseExceptionMapper and ParamConverterProvider implementations) via their public no-arg constructor. If instantiation fails (abstract class, missing constructor, inaccessible constructor, throwing constructor), it wraps the reflective exception in this IllegalArgumentException. Non-MP providers (filters, interceptors) are instantiated elsewhere and do not hit this path.","triggerScenarios":"builder.register(MyResponseExceptionMapper.class) or register(MyParamConverterProvider.class) where that class lacks a public no-arg constructor, is abstract, or its constructor throws.","commonSituations":"Registering a mapper class that requires constructor injection (e.g. takes a config parameter); registering an abstract base mapper class by mistake; CDI users forgetting that class-based registration here means reflective instantiation, not CDI creation.","solutions":["Add a public no-argument constructor to the provider class (or make the existing constructor public).","Register an instance instead of a class: builder.register(new MyMapper(...)) or use @RegisterProvider / CDI-managed registration for annotation-registered providers.","Ensure the class is concrete (not abstract or an interface)."],"exampleFix":"// before\npublic class MyMapper implements ResponseExceptionMapper {\n    public MyMapper(String config) { ... } // no no-arg ctor\n}\n\n// after\npublic class MyMapper implements ResponseExceptionMapper {\n    public MyMapper() { ... }\n}","handlingStrategy":"validation","validationCode":"Class<?> c = MyMapper.class;\nboolean ok = !java.lang.reflect.Modifier.isAbstract(c.getModifiers());\ntry { c.getDeclaredConstructor().newInstance(); } catch (Exception e) { /* fail fast before register */ }","typeGuard":"boolean instantiableProvider(Class<?> c) {\n    return !c.isInterface() && !java.lang.reflect.Modifier.isAbstract(c.getModifiers())\n        && java.util.Arrays.stream(c.getDeclaredConstructors())\n            .anyMatch(k -> k.getParameterCount() == 0 && java.lang.reflect.Modifier.isPublic(k.getModifiers()));\n}","tryCatchPattern":"try {\n    builder.register(MyMapper.class);\n} catch (IllegalArgumentException e) {\n    builder.register(new MyMapper(dep)); // instance fallback\n}","preventionTips":["Always give ResponseExceptionMapper/ParamConverterProvider classes a public no-arg constructor.","Register by instance when constructor injection is required.","Unit-test provider registration in a plain builder before app startup."],"tags":["rest-client","quarkus","reflection","provider-registration"],"backgroundTag":"missing-no-arg-constructor","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"}