【问题标题】:Is inheritance allowed for EJB3 Stateless Session Beans?EJB3 无状态会话 Bean 是否允许继承?
【发布时间】:2012-06-08 12:42:49
【问题描述】:

假设我有一个无状态 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 创建了一个接口,因为@LocalBean 现在也由FooMock 实现。 OpenEJB 试图将两个类同名的同一个生成接口绑定,这是不可能的。

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

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

【问题讨论】:

  • 应该可以继承 EJB 类;子类不会是 EJB,但如果您只是在测试,那也没关系。你得到了什么例外?

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


【解决方案1】:

宁可做类似的事情:

@Local
public interface Foo {
...
}

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

然后制作你的模拟。

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

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

【讨论】:

  • 感谢您的回答,使用单独的界面,这是有效的,但也是我们想要避免的:)。 Arquillian 似乎是一个很棒的框架,我去看看...
  • 有什么理由要避开这个界面吗? @LocalBean 在许多情况下都很棒而且很有用,但是如果您将使用模拟,那么使用接口可能是一个好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 2014-10-13
  • 2011-01-02
  • 1970-01-01
相关资源
最近更新 更多