代码之家  ›  专栏  ›  技术社区  ›  johnstok

如何为EJB选择本地接口?

  •  0
  • johnstok  · 技术社区  · 17 年前

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

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

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

    具体来说,我不知道如何创建一个@EJB注释来选择 地方的 界面例如,以下内容是否足够?

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

    特别是,我希望避免仅仅为了区分via@EJB的'beanInterface'属性而创建单独的本地和远程接口。

    3 回复  |  直到 17 年前
        1
  •  3
  •   Antonio    17 年前

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

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

        2
  •  1
  •   Timo    17 年前

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

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

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

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

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

    public interface Queries () { .. }
    
    @Local
    public interface QueriesLocal extends Queries () { .. }
    
    @Remote
    public interface QueriesRemote extends Queries () { .. }
    
        3
  •  1
  •   Guido    14 年前

    前面评论中的解决方案与Jboss上的EJB3.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 () { ... }
    

    它起作用了