【问题标题】:How to Inject Singleton EJB(Container Resource) into POJO(non Container resource)?如何将单例 EJB(容器资源)注入 POJO(非容器资源)?
【发布时间】:2013-10-10 23:12:49
【问题描述】:

我想将一个单例 EJB 注入我的 POJO 类。 使用新的 EJB 3.1 规范,是否可以将 EJB 注入 POJO? 我知道在 EJB 3.0 中,@EJB 注释可用于注入 EJB,但这不适用于简单的 POJO。 @javax.inject.Inject 也不适合我。

还有一点,容器资源和非容器资源有什么区别? 如何实现,我使用的是 JBoss AS 7.1.1。

【问题讨论】:

  • 你最后一个问题不完整:what有什么区别?
  • 要使用@Inject,您应该拥有 beans.xml 文件。请参考:seamframework.org/Documentation/WhatIsBeansxmlAndWhyDoINeedIt
  • 谢谢 bkail 和 Chechus ,抱歉我错过了最后一个问题...我的问题是,容器资源和非容器资源有什么区别?如果可能,请提出任何例子......
  • 我不认为“容器资源”是规范定义的术语;在哪里找到的?无论如何,它可能意味着“由容器创建/注入的对象”,如我的回答中所述。

标签: jboss7.x cdi ejb-3.1


【解决方案1】:

@EJB 对您不起作用,因此您只有两个选择 - JNDI 查找或使用 CDI。像

@Inject
private MyEJB ejb;

应该适合你。还要检查WEB-INF 文件夹中是否有beans.xml,以便激活CDI 容器。

而区别在于 - 它几乎相同(虽然建议使用 @Inject),但只有一个例外 - 您仍然必须使用 @EJB 来注入远程 bean。

您不能使用service = new ServiceClass(); 的原因是service 对象将不受容器管理 - 这意味着在创建此类后不会执行任何注入,因为容器不再控制此对象.很天真地说,如果你这样做了

@Inject
ServiceClass service;

容器将创建新实例,然后执行注入并将其返回给您。

【讨论】:

  • 感谢 Petr,我已经按照您的方法进行了尝试,如果某些 servlet 尝试注入 EJB,它工作正常。但是,每当我在 servlet "doget" 方法和 POJO 类中创建 POJO 类的对象时,我都会尝试注入 EJB ,它返回 null。
  • 我也附上了代码 sn-p: Servlet doGET 方法 :---> protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServiceClass service = new ServiceClass(); service.contactEJB();服务类如下: @Inject private ITestSingletonEJB testSingletonEJB ; public void contactEJB() { testSingletonEJB.doProcessing(); }
  • 请让我知道如果我犯了任何错误,急切地等待你的回复:)
  • 好吧,我猜这是调用service = new ServiceClass();引起的。您不需要创建此对象(您希望容器调用new,创建此对象并执行所有注入(在您的情况下为EJB bean)。所以只需使用答案中的 sn-p 并不要'不要自己创建 POJO 或任何其他 bean,只需让容器来执行此操作即可。
  • Thnks Petr ,但我仍然不太清楚为什么我们不能像 service = new ServiceClass() 这样从 POJO 注入 ejb? 1)容器资源和非容器资源有什么区别?如果可能,请提出任何示例... 2) CDI 中生产者方法的用途是什么?
【解决方案2】:

EE 是围绕组件类(EJB、servlet 等)的思想设计的。 EE容器只有在控制对象的创建时才能进行注入,而POJO不适用于POJO,所以不能对POJO对象使用EE注入。

要使 CDI 正常工作,您需要将 META-INF/beans.xml 添加到您的存档中。即使这样,您也无法使用new 创建 POJO 实例。你总是必须让容器创建实例,所以要么@Inject POJO,然后可以@Inject EJB,要么使用javax.enterprise.inject.spi.BeanManager

【讨论】:

  • 谢谢 bkail 和 Chechus,对不起,我错过了最后一个问题……我的问题是,1)容器资源和非容器资源有什么区别?如果可能,请提出任何示例... – 2) CDI 中生产者方法的用途是什么?
猜你喜欢
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
相关资源
最近更新 更多