我们有一个带有EJB 3.0模块的应用程序。我们希望覆盖EJB实现中的业务逻辑。有可能吗?
一旦我覆盖,如何查找或注入被覆盖的会话bean?
public interface TestRemote {
public String result(String arg1, String arg2);
}
@Stateless
public class TestBeanOne implements TestRemote {
public String result(String arg1, String arg2) {
return "TestBeanOne " + arg1 + arg2;
}
//Is the below code possible?
public class TestBeanTwo extends TestBeanOne {
public String result(String arg1, String arg2) {
return "TestBeanTwo " + arg1 + arg2;
}
答案 0 :(得分:0)
是的,代码是可能的,你只需要注释它。注释可以被部署描述符覆盖。
答案 1 :(得分:0)
您应该理解EJB仍然是一个简单的Java类。使用EJB可以实现Java类的所有功能。 所以只要像任何会话Bean那样查找类。
答案 2 :(得分:0)
假设TestBeanTwo
类没有故意使用@Stateless
,该类将不是无状态会话bean,因此无法查找或注入EJB。即使使用@Stateless
或ejb-jar.xml
文件中的声明,TestBeanTwo
bean类也不会公开TestRemote
接口,而只是一个碰巧有public String result(String, String)
接口的无接口视图{1}}可用。
EJB 3.1规范在4.9.2.1 Session Bean Superclasses
(第121页)一节中说明:
允许会话bean类具有自己的会话bean类的超类。但是,对于此案例,没有适用于注释处理或部署描述符的特殊规则。出于处理特定会话bean类的目的,无论超类本身是会话bean类,所有超类处理都是相同的。在这方面,将会话bean类用作超类仅仅代表了实现继承的方便用法,但没有组件继承语义。
在规范的同一页面上:
特定会话bean公开的客户端视图不会被也定义会话bean的子类继承。
我认为规范中的这两个摘录很好地解释了这个问题。