Quarkus扩展中@RegisterProvider对客户端拦截器无效问题
解决Quarkus Rest Reactive自定义扩展中客户端拦截器不生效的问题
以下是针对问题的排查和解决步骤:
1. 调整AdditionalBeanBuildItem的配置
在扩展的QuarkusMvpMessageHandlerExtProcessor中,添加AdditionalBeanBuildItem时明确指定Bean的不可移除性和应用级可见性:
@BuildStep AdditionalBeanBuildItem addClientFilter() { return AdditionalBeanBuildItem.unremovableOf(MessageHandlerClientRequestFilter.class) .setVisibility(AdditionalBeanBuildItem.BeanVisibility.APPLICATION); }
unremovableOf可避免Quarkus优化机制误删该Bean,setVisibility确保业务应用能正常识别到扩展中的Bean。
2. 修正客户端过滤器的注解组合
将客户端过滤器的@ApplicationScoped替换为@Dependent,保留@Provider:
@Provider @Dependent public class MessageHandlerClientRequestFilter implements ClientRequestFilter { // 拦截逻辑实现 }
JAX-RS客户端过滤器无需@ApplicationScoped的生命周期,@Dependent更适配其使用场景,可避免实例化或代理时的异常。
3. 在扩展层面注册客户端过滤器
移除业务代码中的@RegisterProvider,改为在扩展部署处理器中添加JaxrsProviderBuildItem:
@BuildStep JaxrsProviderBuildItem registerClientFilter() { return new JaxrsProviderBuildItem(MessageHandlerClientRequestFilter.class); }
JaxrsProviderBuildItem是Quarkus专门用于注册JAX-RS提供者(含客户端过滤器)的BuildItem,比AdditionalBeanBuildItem更适配JAX-RS场景。
4. 修正扩展的beans.xml配置
将扩展运行时jar中META-INF/beans.xml内容改为:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd" bean-discovery-mode="all"> </beans>
空beans.xml默认是annotated模式,可能导致扩展内Bean无法被正确扫描,设置bean-discovery-mode="all"可确保所有Bean被识别。
5. 验证客户端实例的注入方式
确保业务代码中使用Quarkus的注入方式创建Rest客户端:
@Inject @RestClient MyClient myClient;
手动实例化的客户端不会自动加载扩展中注册的过滤器,必须依赖Quarkus的依赖注入机制。
内容的提问来源于stack exchange,提问作者tbkahuna
相关产品推荐
相关产品推荐

