【问题标题】:HK2 / Jersey does not Inject into non Resource classHK2 / Jersey 不注入非资源类
【发布时间】:2016-02-01 09:26:58
【问题描述】:

我正在使用 jersey 在不同位置注入 POJO。这是我的配置:

 register(new AbstractBinder() {
        @Override
        protected void configure() {
            bind(Bar.class).to(Bar.class).in(Singleton.class);
            bindFactory(FooFactory.class).to(Foo.class).in(Singleton.class);
            ...
        }
    });

FooFactory:

public class FooFactory implements Factory<Foo> {
    @Override
    public Foo provide() {
        return Foo.newInstance();
    }
}

注入资源有效:

@Path("/myresource")
public class MyResource{
     @Inject
     protected Bar instance;
}

但是

public class Foo {
     @Inject
     protected Bar instance;
}

没有。 Foo.instance 为空。为什么?以及如何让它发挥作用?

【问题讨论】:

    标签: java jersey hk2


    【解决方案1】:

    您的工厂正在创建 Foo,因此 DI 框架将不再尝试任何注入。您需要让 DI 框架创建 Foo 的实例或自己在 FooFactory 中处理注入。

    例如,您的 FooFactory 可以有一个 Bar 字段,用于初始化 Foo...

    public class FooFactory implements Factory<Foo> {
        private final Bar theBar;
    
        @Inject
        public FooFactory(Bar bar) {
            theBar = bar;
        }
    
        @Override
        public Foo provide() {
            return Foo.newInstance(bar);
        }
    }
    

    【讨论】:

    • 或者你可以将ServiceLocator注入FooFactory,自己注入Foo实例。 locator.inject(fooInstance);
    • 非常感谢!但是怎么知道呢?我在 HK2 网站上没有找到任何关于此的文档。有吗?
    • 这似乎很复杂,因为我现在必须另外担心我的类是如何被实例化的。基本上这意味着搜索整个项目以确定我的对象是否由工厂实例化 - 并基于此决定我的 @Inject 是否有效。
    • DI 没有为您提供创建对象的灵丹妙药。它只是允许您将对象创建与对象使用分开。此外,当您告诉您的 DI 框架它应该使用工厂来创建对象时,您基本上是在告诉框架您负责创建该对象。
    猜你喜欢
    • 2015-11-03
    • 2014-12-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多