首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JEE6 :替代的EJB声明

JEE6 :替代的EJB声明
EN

Stack Overflow用户
提问于 2013-01-21 19:36:02
回答 2查看 4.8K关注 0票数 1

我使用的是带有CDI的JBoss 7.1.1。

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

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

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

代码语言:javascript
运行
复制
java.lang.IllegalArgumentException: JBAS011046: A component named 'ServiceAccount' is already defined in this module

这是真的,两个服务都是以相同的方式声明的(@Stateless(name="ServiceAccount"))。

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

有人知道怎么做吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-22 07:27:34

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

如果bean的客户端只在本地,那么您应该使用CDI类型注入选择。

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

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

因此,我认为您不能将EJB名称注入选择和CDI替代注入选择混合在一起。

票数 8
EN

Stack Overflow用户

发布于 2013-01-21 20:07:42

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

代码语言:javascript
运行
复制
@Stateless(name="ServiceAccount")
@Alternative
public class ServiceAccountMock{
....
}

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

代码语言:javascript
运行
复制
...
<alternatives>
    <class>xx.yy.ServiceAccountMock</class>
</alternatives>
...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14437774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档