Jersey项目使用hk2依赖注入时注入对象返回null如何解决
错误原因
- 核心问题是你手动通过
new ClassA()创建的实例不受HK2依赖注入容器管理。HK2只会对自身生命周期内托管的对象自动处理@Inject注解的字段注入逻辑,手动new的对象框架不会做任何注入操作,因此classB属性必然为null。 - 另外你的
MyApplicationBinder中仅完成了ClassB的绑定配置,并未将IClassA接口与实现类ClassA注册到HK2容器中,即使你尝试从容器中获取IClassA实例也会失败。
解决步骤
步骤1:补充IClassA的绑定配置
修改MyApplicationBinder类的configure方法,添加IClassA的绑定规则,可根据业务需求选择合适的作用域(示例用Singleton单例作用域):
package com.example.test.di public class MyApplicationBinder extends AbstractBinder { @Override protected void configure() { bind(ClassB.class).to(ClassB.class).in(Singleton.class); // 新增IClassA绑定 bind(ClassA.class).to(IClassA.class).in(Singleton.class); } }
步骤2:从HK2容器获取IClassA实例,禁止手动new创建
根据你的使用场景选择对应的获取方式:
- 如果是在Jersey托管的对象中使用(比如接口Resource类、其他已经注入的托管Bean),直接通过
@Inject注入即可:@Inject private IClassA classA; - 如果是在非Jersey托管的普通业务代码中使用,需要先获取HK2的
ServiceLocator实例再拉取Bean:// ServiceLocator可以从ServletContext中获取,也可在初始化时提前持有,示例代码: IClassA classA = serviceLocator.getService(IClassA.class);
可选优化
推荐将字段注入改为构造注入,更易排查注入问题,也符合依赖注入的最佳实践:
package com.example.test public class ClassA implements IClassA { private final ClassB classB; @Inject public ClassA(ClassB classB) { this.classB = classB; } @Override public void method() { classB.doSomething(); } }
内容的提问来源于stack exchange,提问作者utarid
相关产品推荐
相关产品推荐

