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

Java 通过注入从JBoss AS中的不同WAR访问EJB,java,jakarta-ee,jboss7.x,cdi,ejb-3.1,Java,Jakarta Ee,Jboss7.x,Cdi,Ejb 3.1,我的项目结构如下 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-por

我的项目结构如下

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
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
我有另一个war(ControlWebPortlet.war),它是一个liferay项目,我正在尝试从ControlWebPortlet访问bean中的上述EJB。bean是@viewscope的,这是基于找到的链接完成的

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

@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;
我在同一个项目ControlWebPortlet中保留了一个EJB,其部署如下

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;
当从不同的服务器访问EJB时,我需要做什么特定的事情吗

提前谢谢


Charlie

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

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

一个可能的解决方法是在第二次战争中,在
jboss部署结构.xml
文件中添加对
VWeb.war
的依赖。看起来是这样的:

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

如果这不起作用,您也可以尝试上述解决方法。

(在
ControlWebPortlet.war
中创建一个
@Stateless
EJB,该EJB通过
@EJB
注入所需的bean,然后通过生产者方法公开该bean,该方法允许您在最终目的地中使用
@Inject

一个可能的修复方法是在第二次war中,将对
VWeb.war
的依赖项添加到
jboss部署结构.xml
文件中。看起来是这样的:

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

如果这不起作用,您也可以尝试上述解决方法。

(在
ControlWebPortlet.war
中创建一个
@Stateless
EJB,它通过
@EJB
注入所需的bean,然后通过producer方法公开这个bean,它允许您在最终目的地中使用
@Inject

显然我刚才回答了这个问题。既然它在那里被标记为正确答案,我想我也应该在这里复制它


我使用以下方法使其工作:

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

public class Resources {
          @Produces
          @EJB(lookup = "java:global/.../WhateverService")
          private WhateverService whateverService;
}
// ...
@Inject
private WhateverService whateverService;
// ...
然后,使用
@inject
注释在bean中注入EJB资源:

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

工作起来很有魅力。我也在使用类似的CDI视图范围方法。

很显然,我刚才已经回答了这个问题。既然它在那里被标记为正确答案,我想我也应该在这里复制它


我使用以下方法使其工作:

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

public class Resources {
          @Produces
          @EJB(lookup = "java:global/.../WhateverService")
          private WhateverService whateverService;
}
// ...
@Inject
private WhateverService whateverService;
// ...
然后,使用
@inject
注释在bean中注入EJB资源:

public class Resources {
          @Produces
          @EJB(lookup = "java:global/.../WhateverService")
          private WhateverService whateverService;
}
// ...
@Inject
private WhateverService whateverService;
// ...
工作起来很有魅力。我还使用了类似的CDI视图范围方法