【问题标题】:Injecting EJB Bean using CDI使用 CDI 注入 EJB Bean
【发布时间】:2015-01-30 04:40:36
【问题描述】:

我正在尝试使用 @Inject 将 EJB 单例 bean 注入 CDI bean。但是注入的实例有时是本地的,有时是远程实例(重新启动时更改)。不一致。

在以下示例中,TestService ejb 的远程实例被注入到 GetTestData cdi 托管 bean。但我期待本地实例。而且它也不一致,有时它会注入本地实例。我通过在 GetTestData 类中打印注入的 bean 发现了这一点。

请注意,我的测试类不包含在部署包中。

知道如何让它持续注入本地实例吗?

EJB 单例 Bean:

@Singleton
@Local(TestService.class)
@Remote(TestServiceRemote.class)
public class TestServiceImpl implements TestService {
    ..
}

CDI 豆:

public class GetTestData {

    @Inject
    TestService testService;

    ....
}

单元测试:

@RunWith(CdiRunner.class)
public class GetTestDataTest {

    @Inject
    private GetTestData getTestData;

    @Produces
    @ProducesAlternative
    @Mock
    private TestService testService;

    .....
}

我使用的是JBoss 7.1.1-Final版本(应用服务器),Weld核心版本是1.1.23-Final。

我无法使用@EJB,因为我正在使用 cdi-unit 进行测试。

【问题讨论】:

  • 您的问题需要澄清。您的目标服务器和版本是什么?什么是 JBoss 1.1.1-Final?你能分享你的测试、EJB 和它的接口吗?
  • Antoine,添加了示例代码以提高清晰度并回答了您的问题。

标签: jakarta-ee jboss ejb jboss7.x cdi


【解决方案1】:

首先,请记住,CDI 注入不支持开箱即用的远程 EJB(通过@Inject 注释)。当使用 EJB 作为 CDI bean 时,它的远程接口被排除在 bean 的类型集中,如 here 所述。 为了能够使用远程 EJB,您必须像这样将其声明为 resource。

public class ResourceProducers {

@Produces @EJB(ejbLink="../their.jar#TestServiceRemote")
TestServiceRemote remoteService;

}

因此,您遇到的行为可能来自 CDI 单元,因为 CDI 不可能在注入点中使用远程 EJB 接口。

我的建议:

  1. 问问自己是否真的需要在应用程序中使用 EJB 远程。今天,对于 JAX-RS 和其他技术,如 websocket,它们有点过时了。
  2. 如果您不需要 EJB 远程,请将 EJB support 注释添加到您的 CDI 单元测试中,它可能有助于框架为您提供预期的 EJB 行为(单例)。也不要像你那样模拟 EJB:我认为 CDI-Unit 不会在你的模拟中复制 EJB 特性。
  3. 如果您想坚持使用 EJB 远程,我想您将不得不切换到更强大的测试框架,例如 Arquillian。我不是 CDI 单元专家,但我认为他们不支持远程 EJB。
  4. 如果你开始开发,你真的应该考虑使用WildFly应用服务器,下一代JBoss服务器。您将获得 Java EE 7 和更强大的服务器。

【讨论】:

  • 我真正想要的是 GetTestData 中 ejb 的本地视图,而不是远程视图。但我得到的是ejb的远程视图。并且我的 cdi-unit 测试类被排除在部署之外。
  • 正如我所写,CDI 单元不支持开箱即用的 EJB,而且可能不支持远程 EJB。所以你正在经历随机行为。如果你真的想测试远程 EJB,你必须使用 Arquillian 和 EJB 容器,比如 JBoss AS 7.1.1。
  • 忽略单元测试,但我在运行时得到了这种随机的焊接注入行为。
  • 对不起,我不明白。您在示例中输入的代码完全不可能。 @Inject 不能注入远程 EJB,除非您在某处有生产者。能否给出带有接口定义和正确注释的真实代码。
  • 该 ejb 远程视图没有任何生产者。 Jboss cdi 容器(焊接)负责将 ejb bean 注入我的 cdi bean。我在我们的企业应用程序中遇到了这个问题,所以我不能把真正的代码放在这里。
猜你喜欢
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-21
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多