java - EJB3 无状态 session Bean 是否允许继承?

标签 java java-ee-6 cdi ejb-3.1 openejb

假设我有一个无状态的 bean:

@Stateless(name = "fooBean")
@LocalBean
public class Foo {
...
}

我想创建一个用于测试的模拟(使用 CDI)

@Alternative @Specializes
public class FooMock extends Foo {
...
}

我在 beans.xml 中注册了 mock,当我使用 OpenEJB 运行它时,出现以下异常:

...
Caused by: javax.naming.NameAlreadyBoundException:
openejb/Deployment/fooBean/com.company.Foo!LocalBeanHome

在我看来,容器为 Foo 创建了一个接口(interface),因为 @LocalBean 现在也由 FooMock 实现了。 OpenEJB 尝试将两个类绑定(bind)到具有相同生成接口(interface)的相同名称,这是不可能的。

当然,如果我在 Foo 类中注释掉 @Stateless@LocalBean,它就可以正常工作。

有解决这个问题的想法或建议吗?

最佳答案

宁愿做这样的事情:

@Local
public interface Foo {
...
}

@Stateless
public class FooBean implements Foo {
...
}

然后制作你的模拟。

@Alternative
@Specializes
public class FooMock implements Foo {
...
}

不过我建议你看看Arquillian它将使您的测试变得更加容易,而无需 @Alternative 和用于测试的特殊 beans.xml 条目。

关于java - EJB3 无状态 session Bean 是否允许继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10881365/

相关文章:

java - 添加库后不断收到错误 Gradle Build 失败,出现异常 : java. exe' 以非零退出值 2 完成

java - 将换行符写入文件

java - 使用 ObjectMapper 读取嵌套的 json 文件

java - 无法在 Weblogic 中查找 TimerManager 资源

java - CDI 为 bean 选择正确的范围

java - Jsp/MySQL- 将 SELECT 查询的输出存储到字符串中?

java-ee-6 - 使用 CDI/Weld 注入(inject)通用 Bean

Spring 或 CDI 或 EJB3

ajax - 如何将 @ConversationScoped 与 Ajax 请求一起使用?

java - 类 AnnotationLiteral 的独立版本?