【问题标题】:EJB 3.1. Is @Local annotation needed?EJB 3.1。需要@Local 注释吗?
【发布时间】:2012-01-29 10:26:57
【问题描述】:

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

【问题讨论】:

    标签: glassfish-3 ejb-3.1


    【解决方案1】:

    如果您的 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 和 session bean B 暴露本地业务 界面 Bar,但不是 Foo

    会话 bean B 需要在其集合中显式包含 Foo 该界面的公开视图以应用。

    更新:

    作为附加的规范摘录:

    允许会话 bean 类具有超类,这些超类是 自己的会话 bean 类。不过没有特别规定 适用于注释处理或部署的 这种情况的描述符。为了处理特定的 会话 bean 类,所有超类处理都是相同的 超类本身是否是会话 bean 类。

    【讨论】:

    • 感谢您的回答。至于规范的链接,我还是有些疑惑的。它明确讨论了超类,即会话 bean 本身。但是如果它们只是没有@Stateless@Stateful 注释的抽象类呢?
    • 当然,我不确定 100%,但请看一下编辑后的帖子 - 也许会有所帮助。
    • 感谢您的强调。我自己阅读了规范中的那部分,但不知何故错过了。
    猜你喜欢
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 2014-01-26
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多