我目前对Glassfish 3.1.2.2处理EJB的方式感到困惑。Demistifying EJB注释和注入
我有一个OSGi项目,它由许多OSGi包(罐子)组成。此外,还有一些WAR,包括Tapestry Web应用程序。
在一个这样的包,我们称之为“interfaces.jar”,我有一个接口定义:
public interface MyInterface() {
public static final String JNDI_NAME = "java:global/MyInterface";
void myMethod();
}
该接口的实现是以下内容,它包含在捆绑“beans.jar” :
@Stateless
@EJB(name = MyInterface.JNDI_NAME, beanInterface = MyInterface)
public class MyBean implements MyInterface() {
void myMethod() {
...
}
}
我从我的挂毯WAR应用程序通过JNDI查找调用它:
InitialContext.doLookup(MyInterface.JNDI_NAME);
现在,我正在阅读EJB 3.1规范,它说我可以采用以下方案之一:
- 接口有@Local注释; EJB正在实现这个接口。
- 接口是一个普通的Java接口,没有注释;具有@Local注释的EJB正在实现它。
- 接口是一个普通的Java接口,没有注释; EJB正在实现它。
- 接口是一个普通的Java接口,没有注释;带@Local注解的EJB没有实现它。
- EJB没有任何特殊的注释。
因此,通过消除:
- 我没有@Local接口上
- 我没有@Local对EJB
- 似乎有点权
- 我不t在EJB上拥有@Local
- 我在我的EJB上有@EJB注释
因此,它似乎是情况3:
“因为它是唯一实现的EJB接口,容器假定它必须是本地业务接口。”
现在,有几个问题:
- 是我的接口本地或远程的一个,因为没有本地或远程的注释?
- 如果是本地的,我应该可以注入
@EJB
注释,但它会失败吗? - 如果它很远,它不符合上面几行的解释吗?
- 如果我添加
@Local
或@Remote
,并执行JNDI查找,我会得到一个命名异常,NPE告诉我这个JNDI_NAME
下没有任何东西。这怎么可能? @EJB(name = ..., beanInterface = ...)
在bean类上做了什么,它如何与@Local
和@Remote
注释交互?
我很抱歉,出现了不良复制粘贴的情况。 MyInterface是接口,MyBean是实现它的ejb – Lopina