假设我有一个无状态的 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/