到目前为止,我几乎总是使用无接口EJB,并且对@Local注释的需求略有了解。考虑这个例子:
public interface MyBeanIntf { void doStuff(); }
@Stateless
public class MyBean implements MyBeanIntf { public void doStuff(){ } }
MyBeanIntf
是否应标记为@Local
?我没有看到任何好处,因为即使我没有将其注释为@Local
,我仍然可以使用 DI 将其正确地注入UI控制器:
@Named
@SessionScoped
public class TestController implements Serializable {
// injection works perfectly, even when MyBeanIntf is not marked as @Local
@Inject
private MyBeanIntf myBean;
// or even like this:
// @EJB
// private MyBeanIntf myBean;
}
让它变得更复杂:
public interface MyBeanIntf { void doStuff(); }
public class MySuperBean implements MyBeanIntf { public void doStuff() { } }
@Stateless
public class MyBean extends MySuperBean { }
MyBean
现在被认为是有效的Local EJB
bean吗?我有些疑惑,因为它间接地实现了接口。
答案 0 :(得分:8)
如果你的EJB实现了一些接口,但是你没有指定(在EJB和接口本身上)接口(@Remote,@ Local),而不是假设它是@Local接口。
因此您的代码:
public interface MyBeanIntf { void doStuff(); }
@Stateless
public class MyBean implements MyBeanIntf { public void doStuff(){ } }
在语义上与以下内容相同:
@Local
public interface MyBeanIntf { void doStuff(); }
@Stateless
public class MyBean implements MyBeanIntf { public void doStuff(){ } }
当谈到问题的第二部分时,我认为EJB 3.1 FR规范中的 4.9.2.1会话Bean超类部分对您来说很有意思。从我的理解(因此它可能不正确),似乎您的bean不应被视为暴露有效的本地接口,因为以下摘录:
@Stateless
public class A implements Foo { ... }
@Stateless
public class B extends A implements Bar { ... }
假设Foo和Bar是本地业务接口而没有 关联的部署描述符,会话bean A公开本地 业务接口Foo和会话bean B公开本地业务 界面栏,但不是Foo 。
会话bean B需要在其集合中明确包含Foo 公开该视图的视图以供应用。
<强>更新强>
另外还有一个来自规范的摘录:
允许会话bean类具有超类 自己的会话bean类。但是,没有特殊规则 适用于注释或部署的处理 这种情况的描述符。出于处理特定目的 会话bean类,所有超类处理都是相同的 是否超类本身是会话bean类。