我正在使用 Glassfish 3.1.2 在 netbeans API 之上开发一个应用程序。我的 netbeans 应用程序应该是我必须连接到 EJB 的独立 Java 客户端。
我已将我的 EJB 打包到 EAR(企业应用程序)中。我面临的问题是当我尝试查找可用的 EJB 时出现异常。
这是我的 bean 会话:
@Stateless
@EJB(name = "java:global/AltServer", beanInterface = AltServerRemote.class)
public class AltServer implements AltServerRemote {
远程接口:
@Remote
public interface AltServerRemote {
最后是查找调用:
props.setProperty("org.omg.CORBA.ORBInitialHost", getGlassfishHostname());
props.setProperty("org.omg.CORBA.ORBInitialPort", getServerPort());
ctx = new InitialContext(props)
ctx.lookup("java:global/AltServerEnt/AltServer-ejb/AltServer")
关于如何查找打包到 EAR 中的 EJB,我遵循了这个:http : //glassfish.java.net/javaee5/ejb/EJB_FAQ.html#CosNaming 并找到了 jndi 语法:
java:global[/<app-name>]/<module-name>/<bean-name>
所以在我的例子中,我的企业应用程序是AltServerEnt,我的 EJB 模块是AltServer-ejb,我的会话 bean 被称为AltServer(见上文)。
注意:我在会话 bean 中使用了 @EJB 注释来指定一个名称,如我在上面链接的常见问题解答中解释的那样,我不确定当 EJB 是 EAR 的一部分时它是否合适。有人知道吗?
这是我得到的异常,在查找行提出:
java.lang.ClassNotFoundException: com.sun.ejb.codegen.GenericEJBHome_Generated
有很多“Caused”子句,但这里是第一个:
javax.naming.NamingException: Lookup failed for 'java:global/AltServerEnt/AltServer-ejb/AltServer' in SerialContext[myEnv={org.omg.CORBA.ORBInitialPort=3700, java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, org.omg.CORBA.ORBInitialHost=127.0.0.1, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: ejb ref resolution error for remote business interfaceorg.altanis.remote.AltServerRemote [Root exception is java.lang.RuntimeException: Could not invoke defineClass!]]
所以我想我的会话 bean 没有找到,但为什么?我的 JNDI 语法不对?
编辑:只是要注意我的项目组织:
- AltServerEnt:企业应用程序 - 包含 EJB 模块
- AltServer-ejb:EJB 模块 - 包含会话 bean 和包含远程接口 (AltServerRemote) 的 netbeans 插件。
谢谢阅读。