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,22 @@ 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 (DotName dotName : providersFromBuildItems ) {
345+ registerGlobalProvider (dotName , index , constructor , reflectiveClassesProducer );
341346 }
347+ unremovableBeansProducer .produce (UnremovableBeanBuildItem .beanTypes (providersFromBuildItems ));
342348 }
343349
344350 MultivaluedMap <String , GeneratedClassResult > generatedProviders = new QuarkusMultivaluedHashMap <>();
@@ -361,6 +367,23 @@ void registerProvidersFromAnnotations(CombinedIndexBuildItem indexBuildItem,
361367 unremovableBeansProducer .produce (UnremovableBeanBuildItem .beanClassNames (annotationRegisteredProvidersImpl ));
362368 }
363369
370+ private void registerGlobalProvider (DotName providerClassName ,
371+ IndexView index , MethodCreator methodCreator ,
372+ BuildProducer <ReflectiveClassBuildItem > reflectiveClassesProducer ) {
373+ int priority = getAnnotatedPriority (index , providerClassName .toString (), Priorities .USER );
374+
375+ methodCreator .invokeVirtualMethod (
376+ MethodDescriptor .ofMethod (AnnotationRegisteredProviders .class , "addGlobalProvider" ,
377+ void .class , Class .class ,
378+ int .class ),
379+ methodCreator .getThis (), methodCreator .loadClassFromTCCL (providerClassName .toString ()),
380+ methodCreator .load (priority ));
381+
382+ // when the server is not included, providers are not automatically registered for reflection,
383+ // so we need to always do it for the client to be on the safe side
384+ reflectiveClassesProducer .produce (ReflectiveClassBuildItem .builder (providerClassName .toString ()).build ());
385+ }
386+
364387 @ BuildStep
365388 AdditionalBeanBuildItem registerProviderBeans (CombinedIndexBuildItem combinedIndex ) {
366389 IndexView index = combinedIndex .getIndex ();
0 commit comments