English 中文(简体)
我该如何为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的本地接口?

具体来说,我不确定如何创建一个选择本地接口的@EJB注释。例如,以下是否足够?

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

特别是我想避免为区分@EJBs的beanInterface属性而创建单独的本地和远程接口。

最佳回答

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

编辑:请查看“EJB3规范简化”第3.2节,网址为http://jcp.org/aboutJava/communityprocess/final/jsr220/index.html

问题回答

当一个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 () { .. }

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

它起作用了。





相关问题
热门标签