1

我正在使用带有 CDI 的 JBoss 7.1.1。

我在 JNDI 中有一个名为 ServiceAccount 的无状态 bean。这是真正的服务实现。我有另一个名为 ServiceAccountMock 的 Statelss bean,它是一个 Mock 服务。两者都继承自同一个接口,并封装在一个 service.ear 中。

我想要做的是在 bean.xml 中声明模拟服务作为替代,重新​​部署我的服务耳,然后所有客户端都看到模拟版本(不更改客户端的任何内容)。

当我部署我的 service.ear 时,JBoss 说:

java.lang.IllegalArgumentException: JBAS011046: A component named 'ServiceAccount' is already defined in this module

确实如此,两种服务的声明方式相同(@Stateless(name="ServiceAccount"))。

如果我更改模拟版本的名称,我必须在客户端更改使用哪个 EJB(我不想这样做)。

有谁知道这是怎么做到的吗 ?

4

2 回答 2

8

我认为您无法在同一个应用程序中部署 2 个具有相同名称的 bean。

如果 bean 的客户端只是本地的,则应该使用 CDI 类型注入选择。

  • 如果您确实需要一个名称,请删除 bean 的名称或输入不同的名称(模拟将具有与实际实现不同的名称)。
  • @Alternative将注释保留在模拟上。
  • 在注入点,使用接口作为变量的类型(并且可能使用@Inject注释而不是注释@EJB可能会有所帮助)。

EJB 规范和 CDI 还没有完全一致。EJB 有一些元素,比如名称,需要在应用程序中是唯一的,并且在 CDI 替代功能中没有考虑到。

所以我认为您不能混合使用 EJB 名称注入选择和 CDI 替代注入选择。

于 2013-01-21T23:27:33.683 回答
0

首先,您需要使用 , 进行注释ServiceAccountMock@Alternative以告诉容器在没有指示的情况下不要使用它。

@Stateless(name="ServiceAccount")
@Alternative
public class ServiceAccountMock{
....
}

然后beans.xml你需要告诉 A/S 选择模拟实现:

...
<alternatives>
    <class>xx.yy.ServiceAccountMock</class>
</alternatives>
...
于 2013-01-21T12:07:41.547 回答