首先,我将描述我在这里要完成的任务。我有一个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;
警告是:
没有豆有资格注射到注射点[JSR-299§5.2.1]
当我尝试发布项目时,我收到有关CurrentDataController的 class not found exception 的错误。
引起:java.lang.ClassNotFoundException:来自[Module“deployment.TestEAR.ear.TestEJB.jar:来自”服务模块加载器“的controller.CurrentDataController]
似乎EJB项目无法在JSF项目中引用类。它还在TestEJB.jar中而不是在TestJSF.jar中查找CurentDataController类。我在这里缺少什么?
我整个项目的结构如下:
现在我认为在我修复了没有发现类定义的错误后,我会发现另一个与我发布的警告相关的问题。
答案 0 :(得分:3)
在EAR中,EJB模块(jar)没有Web模块的可见性(war)。 EJB模块与UI无关,因此将此层解耦是正常的。 要解决问题,您有两种选择。