【问题标题】:How can I select the local interface for an EJB?如何为 EJB 选择本地接口?
【发布时间】:2009-03-11 12:11:30
【问题描述】:

假设我有以下 EJB(使用 ejb3):

@Stateless(name="Queries")
@Remote(Queries.class)
@Local(Queries.class)
public final class QueriesEJB implements Queries {
    ...
}

该类可通过本地和远程接口使用。

如何将这个 EJB 的本地接口注入应用程序的另一部分?

具体来说,我不确定如何创建选择 local 接口的@EJB 注释。例如,以下就足够了吗?

@EJB(name="Queries") private Queries queries;

我特别想避免仅仅为了通过@EJB 的“beanInterface”属性进行区分而创建单独的本地和远程接口。

【问题讨论】:

    标签: java jakarta-ee ejb-3.0 ejb


    【解决方案1】:

    根据规范,您不能同时拥有远程和本地接口。但是,您创建一个超级接口,将所有方法放在那里,然后创建 2 个子接口。完成后,只需使用@EJB。这样一来,您根本只需要维护一个接口。

    编辑:请参阅http://jcp.org/aboutJava/communityprocess/final/jsr220/index.html“EJB3 规范简化”中的第 3.2 节

    【讨论】:

    【解决方案2】:

    部署 EJB 时,容器会查看接口并识别本地和远程接口。我会说 EJB 容器已经在您的示例中使用了本地接口。在这种情况下使用远程接口根本没有意义,因为容器可以选择使用本地接口。

    如果您想确保尝试使用本地接口的 JNDI 名称作为 @EJB 注释的参数。

    @EJB(name="java:comp/env/ejb/EntitySupplierLocal")
    

    在上面的示例中,我在接口名称中添加了本地。在您的情况下,您必须查看 JNDI 上下文以获得正确的名称,或者您甚至知道它;)。

    一般来说,我建议使用定义了业务方法的基本接口并扩展本地和远程接口。因此,您不必复制方法,并且可以分别扩展本地和远程访问的功能。

    public interface Queries () { .. }
    
    @Local
    public interface QueriesLocal extends Queries () { .. }
    
    @Remote
    public interface QueriesRemote extends Queries () { .. }
    

    【讨论】:

      【解决方案3】:

      以前 cmets 的解决方案与 Jboss 上的 EJB 3.0 不完全兼容。

      你很容易得到这个错误:

      org.jboss.ejb3.common.resolvers.spi.NonDeterministicInterfaceException:
      beanInterface specified, Queries, is not unique within EJB QueriesEJB
      

      只创建这个:

      public interface Queries ()  //Local by default
      
      @Remote
      public interface QueriesRemote extends Queries () { ... }
      

      有效

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-12
        • 2011-04-17
        • 1970-01-01
        • 2011-03-06
        • 2020-09-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多