泛型服务类绑定问题:HK2依赖注入失败如何正确绑定?
解决HK2泛型接口依赖注入的绑定问题
这个问题我之前也碰到过,HK2对泛型接口的绑定需要明确指定具体的泛型参数,不然它没法区分不同的泛型实现~
错误根源分析
你原来的绑定代码只是把两个实现类绑定到了原始的GenericInterface接口,没有指定泛型参数OwnClass和OwnClass2。由于Java的类型擦除机制,HK2会默认把这两个实现都当成同一个无泛型参数的GenericInterface类型。当Class1请求GenericInterface<OwnClass>、Class2请求GenericInterface<OwnClass2>时,HK2找不到对应的绑定匹配,自然就抛出UnsatisfiedDependencyException了。
正确的绑定方式
需要使用HK2的TypeLiteral类来创建带有具体泛型参数的接口类型,以此绕过类型擦除,让HK2能识别不同的泛型绑定。修改你的ServiceBinder绑定代码如下:
import org.glassfish.hk2.api.TypeLiteral; // 绑定GenericInterfaceImpl到带OwnClass泛型的GenericInterface bind(GenericInterfaceImpl.class) .to(new TypeLiteral<GenericInterface<OwnClass>>() {}); // 绑定GenericInterfaceImplImpl到带OwnClass2泛型的GenericInterface bind(GenericInterfaceImplImpl.class) .to(new TypeLiteral<GenericInterface<OwnClass2>>() {});
为什么这样有效?
TypeLiteral通过创建匿名子类的方式保留了泛型参数的具体信息(避免了Java编译时的类型擦除)。这样HK2就能准确匹配Class1构造函数中需要的GenericInterface<OwnClass>,以及Class2需要的GenericInterface<OwnClass2>,分别注入对应的实现类。
内容的提问来源于stack exchange,提问作者Celestine Babayaro
相关产品推荐
相关产品推荐

