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

Jersey/HK2同一接口两种实现如何正确注入非缓存版本实现缓存包装?

问题根因

  1. 初始注册时两个MyService实现的优先级(rank)完全相同,HK2无法自动判断CachingMyService中要注入的MyService应该选哪个实现,所以抛出UnsatisfiedDependencyException。
  2. 加了@NonCached注解后问题依旧,是因为你只在实现类上加了注解,没有在Binder绑定时关联该Qualifier,HK2不会自动识别实现类上的Qualifier生效。

正确实现方案

步骤1:保留你定义的@NonCached Qualifier

@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface NonCached {
}

步骤2:新增Qualifier的Literal实现

这是HK2识别注解的标准配套实现:

import org.glassfish.hk2.api.AnnotationLiteral;

public class NonCachedLiteral extends AnnotationLiteral<NonCached> implements NonCached {
    public static final NonCached INSTANCE = new NonCachedLiteral();
}

步骤3:修改Binder绑定配置

绑定MyServicePlain时关联@NonCached注解,同时调整两个实现的优先级:给对外使用的缓存实现更高的rank,保证其他业务代码注入无Qualifier的MyService时,自动拿到缓存版本。

public class ApplicationBinder extends AbstractBinder {
    @Override
    protected void configure() {
        // 绑定非缓存实现,关联@NonCached Qualifier,优先级设为低
        this.bind(MyServicePlain.class)
            .to(MyService.class)
            .in(Singleton.class)
            .qualifiedBy(NonCachedLiteral.INSTANCE)
            .ranked(1);
        // 绑定缓存实现,优先级更高,作为默认注入的实现
        this.bind(CachingMyService.class)
            .to(MyService.class)
            .in(Singleton.class)
            .ranked(10);
    }
}

步骤4:保持CachingMyService的注入声明不变

class CachingMyService implements MyService {
       @Inject @NonCached 
       MyService inner;
       // 其余缓存逻辑不变
}

额外注意点

你贴出的代码中MyService接口定义的doIt返回值是void,但实现类CachingMyService里的doIt返回了int,要先修正这个接口和实现的返回值不匹配问题,避免后续运行报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:06:04