如何在Quarkus扩展中注册@Interceptor拦截器
Quarkus扩展注册CDI拦截器的正确方案
你不需要使用InterceptorResolverBuildItem,通过AdditionalBeanBuildItem注册拦截器和对应的绑定注解即可完成配置。
步骤1:确认runtime模块代码位置
你的@Log绑定注解和LoggingInterceptor类需要放在扩展的runtime模块中,保持现有代码逻辑不变,注意补全日志调用的方法名即可,也可按需添加优先级配置:
@Log @Interceptor @Priority(1000) // 可选配置,数值越小拦截器执行优先级越高 public class LoggingInterceptor { @AroundInvoke Object around(InvocationContext context) throws Throwable { Method method = context.getMethod(); Logger logger = LoggerFactory.getLogger(method.getDeclaringClass()); // 原代码缺少日志级别方法,这里补全为info,可根据需求调整为debug/error等 logger.info("Entering {}.{}", method.getDeclaringClass().getSimpleName(), method.getName()); return context.proceed(); } }
步骤2:在deployment模块添加注册逻辑
在扩展的deployment模块的处理器类中,添加如下@BuildStep方法:
import io.quarkus.arc.deployment.AdditionalBeanBuildItem; import io.quarkus.deployment.annotations.BuildStep; public class LoggingExtensionProcessor { @BuildStep AdditionalBeanBuildItem registerLoggingInterceptor() { return AdditionalBeanBuildItem.builder() // 注册拦截器绑定注解 .addBeanClass(Log.class) // 注册拦截器实现类 .addBeanClass(LoggingInterceptor.class) // 标记为不可移除,避免Quarkus Bean裁剪阶段删除拦截器 .setUnremovable() .build(); } }
验证方式
其他项目引入你的扩展后,直接在类或方法上添加@Log注解即可触发拦截逻辑,无需额外配置。
注意事项
- 不需要额外提供
beans.xml配置,Quarkus Arc容器会自动识别注册的拦截器类的@Interceptor注解完成绑定 - 优先级常量可参考
javax.interceptor.Priority(或Jakarta EE对应的jakarta.interceptor.Priority)类的内置定义。
内容的提问来源于stack exchange,提问作者Ronald R. DiFrango
相关产品推荐
相关产品推荐

