假设我有以下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'属性。
答案 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 () { ... }
它有效