Jersey/HK2同一接口两种实现如何正确注入非缓存版本实现缓存包装?
问题根因
- 初始注册时两个
MyService实现的优先级(rank)完全相同,HK2无法自动判断CachingMyService中要注入的MyService应该选哪个实现,所以抛出UnsatisfiedDependencyException。 - 加了
@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
相关产品推荐
相关产品推荐

