如何为EJB选择本地接口?

时间:2009-03-11 12:11:30

标签: java java-ee ejb-3.0 ejb

假设我有以下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 个答案:

答案 0 :(得分:3)

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

编辑:请参阅http://jcp.org/aboutJava/communityprocess/final/jsr220/index.html

中“简化的EJB3规范”中的第3.2节

答案 1 :(得分:1)

部署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 () { .. }

答案 2 :(得分:1)

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

它有效