Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EJB3无状态会话bean是否允许继承?_Java_Java Ee 6_Cdi_Ejb 3.1_Openejb - Fatal编程技术网

Java EJB3无状态会话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

假设我有一个无状态bean:

@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 {
...
}