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

Quarkus中能否在接口上定义拦截器?实践遇阻求助

Quarkus接口级拦截器绑定不生效的解决方案

问题分析

你的实现存在两个核心问题导致拦截器未触发:

  1. CDI拦截器仅作用于public方法:DummyServiceImpl中的successfulCall方法是包私有访问权限,拦截器无法拦截非public方法。
  2. 接口注解未被实现类继承:Java默认的@Inherited元注解仅支持类间注解继承,不覆盖接口到实现类的场景,Quarkus依赖的Weld CDI实现需要显式配置才能让接口上的拦截器绑定注解被实现类继承。

另外注意代码笔误:实现类的implement应为implements,且需正确实现DummyService接口(原代码写的是DummyClient)。

解决方案

步骤1:给拦截器绑定注解添加@Inherited元注解

修改EnableLogging注解,添加@Inherited使其能被实现类继承接口上的注解:

@Target({ TYPE, METHOD })
@Retention(RUNTIME)
@Documented
@InterceptorBinding
@Inherited // 新增元注解,让实现类继承接口上的该注解
public @interface EnableLogging {
}

步骤2:修正实现类的方法权限与接口实现

确保实现类的方法为public,且正确实现目标接口:

@ApplicationScoped
public class DummyServiceImpl implements DummyService {

    @Override
    public void successfulCall(){
         // do something
    }
}

验证拦截器逻辑

修改后拦截器会正常触发aroundInvoke方法:

  • 实现类继承了接口上的@EnableLogging注解,CDI可识别到该绑定
  • 目标方法为public,符合CDI拦截器的拦截范围

内容的提问来源于stack exchange,提问作者khesam109

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 23:27:38