You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:15:11