1

我的项目结构如下

JBoss AS 7.1.3.Final-redhat-4

一个包含 EJB 的战争 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 这已基于此处找到的链接完成

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

@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;

我在同一个项目 ControlWeb-portlet 中保留了一个 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;

从不同的 WAR 访问 EJB 时,我有什么需要特别注意的吗?

提前致谢

查理

4

3 回答 3

1

显然我不久前在JBoss 论坛上回答了这个问题。由于它在那里被标记为正确答案,我想我也会在这里复制它。


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

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

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

@Inject然后,使用注解在 bean 中注入 EJB 资源:

// ...
@Inject
private WhateverService whateverService;
// ...

奇迹般有效。我也在使用类似的 CDI 视图范围方法。

于 2017-07-05T01:23:38.020 回答
0

如果我理解正确,您应该继续将@EJB 用于远程bean。

于 2013-05-14T14:32:10.947 回答
0

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

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

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

于 2013-05-28T12:39:55.730 回答