I had a similar issue; I wanted to use an extension to instrument an application and add request and response filters. For the ContainerResponseFilter
, I used a ContainerResponseFilterBuildItem
to register it.
For the ClientRequestFilter
, I was a bit stuck. I eventually had success using a RegisterProviderAnnotationInstanceBuildItem
. What this process is doing is an extension-side version of what the manual process would be; find classes annotated with @RestClient
, and add a @RegisterProvider(ClientFilter.class)
:
private static final DotName CLIENT_FILTER = DotName.createSimple(ClientFilter.class.getName());
private static final DotName REGISTER_REST_CLIENT = DotName.createSimple("org.eclipse.microprofile.rest.client.inject.RegisterRestClient");
@BuildStep
void clientFilterSupport(CombinedIndexBuildItem indexBuildItem, BuildProducer<GeneratedBeanBuildItem> generatedBean,
BuildProducer<RegisterProviderAnnotationInstanceBuildItem> producer) {
Collection<AnnotationInstance> instances = indexBuildItem.getIndex().getAnnotations(REGISTER_REST_CLIENT);
for (AnnotationInstance instance : instances) {
final AnnotationValue valueAttr = createClassValue(CLIENT_FILTER);
String targetClass = instance.target().asClass().name().toString();
producer.produce(new RegisterProviderAnnotationInstanceBuildItem(targetClass, AnnotationInstance.create(
DotNames.REGISTER_PROVIDER, instance.target(), List.of(valueAttr))));
}
}
The helper for making annotation values is just
private AnnotationValue createClassValue(DotName filter) {
return AnnotationValue.createClassValue("value",
Type.create(filter, Type.Kind.CLASS));
}
I also told CDI about the filter:
@BuildStep
void beans(BuildProducer<AdditionalBeanBuildItem> producer) {
producer.produce(AdditionalBeanBuildItem.unremovableOf(ClientFilter.class));
}