2012-10-20 113 views
1

首先,我要说明什么,我想在这里完成。我有一个Java应用程序,定期读取数据,并呼吁JBoss的EJB无状态AS 7.1.1进一步的操作(计算数据,并将其保存到数据库)。然后我有使用JSF 2.0的前端。在一个@ApplicationScoped CDI bean的控制器中,并驻留在JSF项目中,我将EJB注入到它中。现在我需要用于从数据库获取数据的EJB。我使用的是因为这个原因@ApplicationScoped CDI豆:进样应用范围的CDI豆成无状态EJB豆

方面是所有 servlet请求,Web服务调用,EJB远程方法调用,EJB异步方法调用,EJB超时和消息传递之间共享的应用消息驱动的bean,它们在相同的应用程序中执行。应用程序关闭时应用程序上下文被破坏。

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

现在我想更新@ApplicationScoped CDI豆,这是在JSF项目,EJB bean,这个方法新数据到达时执行的帮助下定义的数据。我已经在@ApplicationScoped CDI bean中成功使用了@Inject,我从EJB项目中注入了EJB。现在我想换一种方式。我试图从JSF项目中将ApplicationScoped CDI bean注入到EJB bean中。但是,当我写这我@Inject强调的警告:

@Inject 
private CurrentDataController currentDataController; 

的警告是:

无豆可享有注射到注射点[JSR-299§5.2.1]

当我尝试发布项目时,我得到关于类的错误,没有找到CurrentDataController的异常

所致:抛出java.lang.ClassNotFoundException:controllers.CurrentDataController从[模块 “deployment.TestEAR.ear.TestEJB.jar:主” 从服务模块加载]

看来,EJB项目不能在JSF项目中引用类。它也是在TestEJB.jar中而不是在TestJSF.jar中寻找CurentDataController类。我在这里错过了什么?

我的整个项目的结构如下:

  • TestEAR
    • TestEJB
    • TestEJBClient
    • TestJPA
    • TestJSF

现在我看后,我将修复约发现我将与我已经发布警告连接的另一问题没有类定义的错误。

回答

3

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

  1. 移动需要在EJB(战争也将能够注入该bean)
  2. 重构你的应用程序只有一个战争被注入一个EJB模块豆(是的,你可以有EJB在战争中)。架构将更简单和完整的EJB将工作在JBoss(远程EJB太)
+0

修复没有类定义错误(清单)后,我测试了应用程序,它没有任何问题。您似乎可以将Application scoped bean从JSF .war注入EJB模块。 –

+1

您在JSF模块中添加了EJB模块中的依赖项。它可以工作,但这不是推荐的做法。 –