通过注入从JBoss AS中的不同WAR访问EJB

时间:2013-05-13 14:23:05

标签: java java-ee jboss7.x cdi ejb-3.1

我的项目结构如下

JBoss AS 7.1.3.Final-redhat-4

包含EJB的war VWeb.war,当部署VWeb时,我得到以下内容

 java:global/VWeb/QServiceImpl!com.vi.qciapi.QService
java:app/VWeb/QServiceImpl!com.vi.qciapi.QService
java:module/QServiceImpl!com.vi.qciapi.QService
java:global/VWeb/QServiceImpl
java:app/VWeb/QServiceImpl
java:module/QServiceImpl

我有另一场战争(ControlWeb-portlet.war)是一个liferay项目,我试图从ControlWeb-portlet访问bean中的上述EJB。 bean是@ViewScoped这是基于找到的here

链接完成的

我已尝试过所有这些组合,但似乎没有任何效果

@Inject
QService qService;

@EJB
QService qService;

@EJB(mappedName="java:global/VWeb/QServiceImpl!com.vi.qciapi.QService")
QService qService;

@EJB(beanInterface=QService.class)
QService qService;

@EJB(mappedName="java:global/VWeb/QServiceImpl!com.vi.qciapi.QService")
QService qService;

我将EJB保存在同一个项目ControlWeb-portlet中,部署如下

java:global/ControlWeb-portlet/CdiServiceImpl!com.clink.cdi.CdiServiceImpl
    java:app/ControlWeb-portlet/CdiServiceImpl!com.clink.cdi.CdiServiceImpl
    java:module/CdiServiceImpl!com.clink.cdi.CdiServiceImpl
    java:global/ControlWeb-portlet/CdiServiceImpl
    java:app/ControlWeb-portlet/CdiServiceImpl
    java:module/CdiServiceImpl

我可以用

注入EJB
@EJB
CdiServiceImpl cdiServiceImpl;

从不同的WAR访问EJB时,我是否有任何特定的内容

提前致谢

查理

3 个答案:

答案 0 :(得分:1)

显然我刚才JBoss forums回答了这个问题。由于它在那里被标记为正确的答案,我想我也会在这里重现它。

我使用以下方法让它工作:

首先,使用@Produces注释将EJB定义为资源:

public class Resources {
          @Produces
          @EJB(lookup = "java:global/.../WhateverService")
          private WhateverService whateverService;
}

然后,使用@Inject注释:

在bean中注入EJB资源
// ...
@Inject
private WhateverService whateverService;
// ...

像魅力一样工作。我也在使用类似的CDI视图范围方法。

答案 1 :(得分:0)

如果我理解正确,你应该继续使用@EJB作为远程bean。

答案 2 :(得分:0)

一种可能的解决方法是在第二次战争中将VWeb.war的依赖项添加到jboss-deployment-structure.xml文件中。看起来像这样:

<jboss-deployment-structure>
  <deployment>
    <dependencies>
      <module name="deployment.VWeb.war" />
    </dependencies>
  </deployment>
</jboss-deployment-structure>

如果这不起作用,您还可以尝试here所述的解决方法 (在@Stateless中创建一个ControlWeb-portlet.war EJB,它通过@EJB注入所需的bean,然后通过生成器方法公开它,这允许您在最终目标中使用@Inject。)