EJB 3.1。是否需要@Local注释?

时间:2012-01-29 10:26:57

标签: glassfish-3 ejb-3.1

到目前为止,我几乎总是使用无接口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吗?我有些疑惑,因为它间接地实现了接口。

1 个答案:

答案 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类。