1

首先,我将描述我要在这里完成的工作。我有一个 Java 应用程序,它定期读取数据并在 JBoss AS 7.1.1 上调用无状态 EJB 以进行进一步操作(计算数据并将其保存到数据库中)。然后我有使用 JSF 2.0 的前端。在作为@ApplicationScoped CDI bean 并且驻留在JSF 项目中的控制器中,我将EJB 注入其中。现在我需要 EJB 从数据库中获取数据。由于这个原因,我正在使用@ApplicationScoped CDI bean:

应用程序上下文在所有servlet 请求、Web 服务调用、EJB 远程方法调用、EJB 异步方法调用、EJB 超时和向在同一应用程序中执行的消息驱动 bean 的消息传递之间共享。当应用程序关闭时,应用程序上下文被销毁。

我只希望所有客户端使用一个 CDI bean,因为数据独立于用户。

现在我想更新 @ApplicationScoped CDI bean 中的数据,它是在 EJB bean 的帮助下在 JSF 项目下定义的,当新数据到达时执行该方法。我已经在@ApplicationScoped CDI bean 中成功使用了@Inject,我从EJB 项目中注入了EJB。现在我想反其道而行之。我试图将 JSF 项目中的 ApplicationScoped CDI bean 注入 EJB bean。但是当我写这篇文章时,我得到了@Inject 下划线作为警告:

@Inject
private CurrentDataController currentDataController;

警告是:

没有 bean 有资格注入到注入点 [JSR-299 §5.2.1]

当我尝试发布项目时,我收到有关CurrentDataController 的类未找到异常的错误。

引起:java.lang.ClassNotFoundException: controllers.CurrentDataController from [Module "deployment.TestEAR.ear.TestEJB.jar:main" from Service Module Loader]

似乎 EJB 项目无法引用 JSF 项目中的类。它还在 TestEJB.jar 中而不是在 TestJSF.jar 中寻找 CurentDataController 类。我在这里缺少什么?

我整个项目的结构如下:

  • 测试EAR
    • 测试EJB
    • 测试EJBClient
    • 测试JPA
    • 测试JSF

现在我认为,在修复有关未找到类定义的错误之后,我将遇到与我发布的警告相关的另一个问题。

4

1 回答 1

3

在 EAR 中,EJB 模块 (jar) 在 Web 模块 (war) 上不可见。EJB 模块与 UI 无关,因此将这一层解耦是正常的。要解决您的问题,您有两种选择。

  1. 将需要在 EJB 中注入的 bean 移动到一个 EJB 模块中(战争也可以注入那个 bean)
  2. 将您的应用程序重构为只有战争(是的,您现在可以在战争中使用 EJB)。架构会更简单,完整的 EJB 将在 JBoss 下工作(远程 EJB 也一样)
于 2012-10-21T08:55:58.410 回答