Quarkus中能否在接口上定义拦截器?实践遇阻求助
Quarkus接口级拦截器绑定不生效的解决方案
问题分析
你的实现存在两个核心问题导致拦截器未触发:
- CDI拦截器仅作用于public方法:
DummyServiceImpl中的successfulCall方法是包私有访问权限,拦截器无法拦截非public方法。 - 接口注解未被实现类继承: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
相关产品推荐
相关产品推荐

