0

我创建了一个 POJO,用于为 RESTful API 的客户端保存上下文,类似于此(实际类是专有的)。

class MyPOJO {

    @Inject
    public AnInjectedInterface obj1;

    @Inject
    public AnotherInjectedInterface obj2;

    public String data1;

    public int data2;

    public long data3;

}

我想这样使用它:

MyPOJO pojo = new MyPOJO();
pojo.data1 = "something";
pojo.data2 = 43;
pojo.data3 = 2875640;
pojo.obj1.someFunction();
pojo.obj2.anotherFunction("something");

如果我这样做,obj1 和 obj2 始终为空。这些接口在非 POJO 类中的其他地方使用并且被正确注入。它们是依赖对象,上面的代码出现在应用程序范围的 bean 中,所以我不能在那里注入 POJO。

我的问题是这个;DI 在不是由容器实例化的对象中不可用吗?如果是这样,有没有办法告诉容器在一个完整的应用程序范围的 bean 中实例化我的依赖 POJO?如果没有,我做错了什么?我的容器是 Wildfly 11。

谢谢你。

4

1 回答 1

0

你这样做是错的。而不是将MyPOJO pojo = new MyPOJO();您用于您想从中使用它的@Inject MyPOJO pojo任何(bean )类。

CDI/Weld 为您创建,在此期间,它将解决所有内部依赖项(obj1obj2您的情况下)。

我看到你已经编辑了这个问题,所以这里有其他一些答案。

首先你可以注入@Dependent@ApplicationScoped如果你需要多个实例,你可以利用Instance<MyPOJO>每个get()你应该得到新的实例。但请注意,您还需要确保处理这些物品!

DI 在不是由容器实例化的对象中不可用吗?

默认情况下,CDI 不会以任何方式处理它。但是,您可以自己执行对此类对象的注入。为了保持精确,您注入的对象将被处理为一个InjectionTarget,您将需BeanManager要这样做。大致方法如下(不是复制粘贴代码):

BeanManager beanManager; // assuming you have obtained BM somehow
CreationalContext<Object> ctx = beanManager.createCreationalContext(null);
InjectionTarget<MyPOJO> injectionTarget = beanManager
                    .getInjectionTargetFactory(beanManager.createAnnotatedType(MyPOJO.class)).createInjectionTarget(null);
injectionTarget.inject(myPojoInstance, ctx);
creationalContext = ctx; // store ctx so you can later on use it to dispose of the dependent instance!
于 2018-06-25T11:22:56.340 回答