Java EJB3无状态会话bean是否允许继承?
假设我有一个无状态bean:Java EJB3无状态会话bean是否允许继承?,java,java-ee-6,cdi,ejb-3.1,openejb,Java,Java Ee 6,Cdi,Ejb 3.1,Openejb,假设我有一个无状态bean: @Stateless(name = "fooBean") @LocalBean public class Foo { ... } 我想创建一个用于测试的模拟(使用CDI) 我在beans.xml中注册了模拟,当我使用OpenEJB运行它时,我得到以下异常: ... Caused by: javax.naming.NameAlreadyBoundException: openejb/Deployment/fooBean/com.company.Foo!LocalBe
@Stateless(name = "fooBean")
@LocalBean
public class Foo {
...
}
我想创建一个用于测试的模拟(使用CDI)
我在beans.xml
中注册了模拟,当我使用OpenEJB运行它时,我得到以下异常:
...
Caused by: javax.naming.NameAlreadyBoundException:
openejb/Deployment/fooBean/com.company.Foo!LocalBeanHome
在我看来,容器为Foo
创建了一个接口,因为@LocalBean
现在也是由FooMock
实现的。OpenEJB尝试使用相同生成接口的相同名称绑定这两个类,这是不可能的
当然,如果我在Foo
类中注释掉@Stateless
和@LocalBean
,则效果很好
有什么想法或建议可以解决这个问题吗?不如做以下事情:
@Local
public interface Foo {
...
}
@Stateless
public class FooBean implements Foo {
...
}
那就开你的玩笑吧
@Alternative
@Specializes
public class FooMock implements Foo {
...
}
但是,我建议您看看它,它将使您的测试变得更加容易,而不需要@Alternative和special beans.xml条目进行测试。应该可以对EJB类进行子类化;子类不会是EJB,但是如果您只是在测试,那么它就无关紧要了。您得到了什么异常?感谢您的回答,有一个单独的界面,可以工作,但这也是我们想要避免的:)。Arquillian似乎是一个很棒的框架,我会检查一下……有什么原因让你想避免使用接口吗@LocalBean在许多情况下都非常有用,但是如果您要使用Mock,使用接口可能是个好主意。
@Alternative
@Specializes
public class FooMock implements Foo {
...
}