JEE6:备用EJB声明

时间:2013-01-21 11:36:02

标签: ejb-3.0 java-ee-6 jboss7.x cdi

我正在使用带有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(我不想这样做)。

有谁知道怎么做?

2 个答案:

答案 0 :(得分:8)

我认为您不能在同一个应用程序中部署同名的2个bean。

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

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

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

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

答案 1 :(得分:0)

首先,您需要使用ServiceAccountMock注释@Alternative,告诉容器如果没有指示,不要使用它。

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

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

...
<alternatives>
    <class>xx.yy.ServiceAccountMock</class>
</alternatives>
...