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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:39:02