105105import io .quarkus .rest .client .reactive .runtime .RestClientReactiveCDIWrapperBase ;
106106import io .quarkus .rest .client .reactive .runtime .RestClientReactiveConfig ;
107107import io .quarkus .rest .client .reactive .runtime .RestClientRecorder ;
108+ import io .quarkus .rest .client .reactive .spi .ClientRequestFilterBuildItem ;
109+ import io .quarkus .rest .client .reactive .spi .ClientResponseFilterBuildItem ;
108110import io .quarkus .rest .client .reactive .spi .RestClientAnnotationsTransformerBuildItem ;
109111import io .quarkus .restclient .config .RegisteredRestClient ;
110112import io .quarkus .restclient .config .RestClientsBuildTimeConfig ;
@@ -281,6 +283,8 @@ public void registerProvidersInstances(CombinedIndexBuildItem indexBuildItem,
281283 void registerProvidersFromAnnotations (CombinedIndexBuildItem indexBuildItem ,
282284 List <RegisterProviderAnnotationInstanceBuildItem > registerProviderAnnotationInstances ,
283285 List <AnnotationToRegisterIntoClientContextBuildItem > annotationsToRegisterIntoClientContext ,
286+ List <ClientRequestFilterBuildItem > clientRequestFilters ,
287+ List <ClientResponseFilterBuildItem > clientResponseFilters ,
284288 BuildProducer <GeneratedBeanBuildItem > generatedBeansProducer ,
285289 BuildProducer <GeneratedClassBuildItem > generatedClassesProducer ,
286290 BuildProducer <UnremovableBeanBuildItem > unremovableBeansProducer ,
@@ -325,20 +329,23 @@ void registerProvidersFromAnnotations(CombinedIndexBuildItem indexBuildItem,
325329 continue ;
326330 }
327331
328- DotName providerDotName = providerClass .name ();
329- int priority = getAnnotatedPriority (index , providerDotName .toString (), Priorities .USER );
330-
331- constructor .invokeVirtualMethod (
332- MethodDescriptor .ofMethod (AnnotationRegisteredProviders .class , "addGlobalProvider" ,
333- void .class , Class .class ,
334- int .class ),
335- constructor .getThis (), constructor .loadClassFromTCCL (providerDotName .toString ()),
336- constructor .load (priority ));
332+ registerGlobalProvider (providerClass .name (), index , constructor , reflectiveClassesProducer );
333+ }
334+ }
337335
338- // when the server is not included, providers are not automatically registered for reflection,
339- // so we need to always do it for the client to be on the safe side
340- reflectiveClassesProducer .produce (ReflectiveClassBuildItem .builder (providerDotName .toString ()).build ());
336+ Set <DotName > providersFromBuildItems = new HashSet <>();
337+ providersFromBuildItems .addAll (clientRequestFilters .stream ().map (ClientRequestFilterBuildItem ::getClassName )
338+ .map (DotName ::createSimple ).collect (
339+ Collectors .toSet ()));
340+ providersFromBuildItems .addAll (clientResponseFilters .stream ().map (ClientResponseFilterBuildItem ::getClassName )
341+ .map (DotName ::createSimple ).collect (
342+ Collectors .toSet ()));
343+ if (!providersFromBuildItems .isEmpty ()) {
344+ for (ClientRequestFilterBuildItem clientRequestFilter : clientRequestFilters ) {
345+ registerGlobalProvider (DotName .createSimple (clientRequestFilter .getClassName ()), index , constructor ,
346+ reflectiveClassesProducer );
341347 }
348+ unremovableBeansProducer .produce (UnremovableBeanBuildItem .beanTypes (providersFromBuildItems ));
342349 }
343350
344351 MultivaluedMap <String , GeneratedClassResult > generatedProviders = new QuarkusMultivaluedHashMap <>();
@@ -361,6 +368,23 @@ void registerProvidersFromAnnotations(CombinedIndexBuildItem indexBuildItem,
361368 unremovableBeansProducer .produce (UnremovableBeanBuildItem .beanClassNames (annotationRegisteredProvidersImpl ));
362369 }
363370
371+ private void registerGlobalProvider (DotName providerClassName ,
372+ IndexView index , MethodCreator methodCreator ,
373+ BuildProducer <ReflectiveClassBuildItem > reflectiveClassesProducer ) {
374+ int priority = getAnnotatedPriority (index , providerClassName .toString (), Priorities .USER );
375+
376+ methodCreator .invokeVirtualMethod (
377+ MethodDescriptor .ofMethod (AnnotationRegisteredProviders .class , "addGlobalProvider" ,
378+ void .class , Class .class ,
379+ int .class ),
380+ methodCreator .getThis (), methodCreator .loadClassFromTCCL (providerClassName .toString ()),
381+ methodCreator .load (priority ));
382+
383+ // when the server is not included, providers are not automatically registered for reflection,
384+ // so we need to always do it for the client to be on the safe side
385+ reflectiveClassesProducer .produce (ReflectiveClassBuildItem .builder (providerClassName .toString ()).build ());
386+ }
387+
364388 @ BuildStep
365389 AdditionalBeanBuildItem registerProviderBeans (CombinedIndexBuildItem combinedIndex ) {
366390 IndexView index = combinedIndex .getIndex ();
0 commit comments