0

假设我有以下 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;

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

4

3 回答 3

3

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

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

于 2009-03-19T16:55:15.427 回答
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 () { .. }
于 2009-03-11T18:45:26.777 回答
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 () { ... }

有用

于 2009-06-09T14:34:02.207 回答