Skip to content

Commit dce8edf

Browse files
committed
Introduce build items for JAX-RS client filters
Closes: #50888
1 parent f2f695b commit dce8edf

File tree

3 files changed

+74
-12
lines changed

3 files changed

+74
-12
lines changed

extensions/resteasy-reactive/rest-client/deployment/src/main/java/io/quarkus/rest/client/reactive/deployment/RestClientReactiveProcessor.java

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@
105105
import io.quarkus.rest.client.reactive.runtime.RestClientReactiveCDIWrapperBase;
106106
import io.quarkus.rest.client.reactive.runtime.RestClientReactiveConfig;
107107
import 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;
108110
import io.quarkus.rest.client.reactive.spi.RestClientAnnotationsTransformerBuildItem;
109111
import io.quarkus.restclient.config.RegisteredRestClient;
110112
import 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();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package io.quarkus.rest.client.reactive.spi;
2+
3+
import io.quarkus.builder.item.MultiBuildItem;
4+
5+
/**
6+
* Used to make a register a global {@link jakarta.ws.rs.client.ClientRequestFilter}
7+
*/
8+
public final class ClientRequestFilterBuildItem extends MultiBuildItem {
9+
10+
private final String className;
11+
12+
public ClientRequestFilterBuildItem(String className) {
13+
this.className = className;
14+
}
15+
16+
public String getClassName() {
17+
return className;
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package io.quarkus.rest.client.reactive.spi;
2+
3+
import io.quarkus.builder.item.MultiBuildItem;
4+
5+
/**
6+
* Used to make a register a global {@link jakarta.ws.rs.client.ClientResponseFilter}
7+
*/
8+
public final class ClientResponseFilterBuildItem extends MultiBuildItem {
9+
10+
private final String className;
11+
12+
public ClientResponseFilterBuildItem(String className) {
13+
this.className = className;
14+
}
15+
16+
public String getClassName() {
17+
return className;
18+
}
19+
}

0 commit comments

Comments
 (0)