1

我正在使用 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 插件。

谢谢阅读。

4

1 回答 1

1

EAR/EJB 显然已部署。因此,打开 Glassfish 管理控制台,例如https://<host>:4848并登录。在左侧,浏览Applications并单击您的应用程序以显示“编辑应用程序”屏幕。检查显示的应用程序名称和组件名称 - 并与您的期望进行比较。

我目前没有部署任何远程 EJB,所以我无法确认 - 但我认为对于远程 EJB,Action列下可能有一个链接来显示 URL。

命名选项

  1. 使用名称AltServer作为 EJB 的名称:name="EJB(name = "AltServer" ...). 使用“简单名称”,可以在各种 JNDI 命名空间(global/app/module)中找到 bean;您的查找ctx.lookup("java:global/AltServerEnt/AltServer-ejb/AltServer")应该有效。

  2. 如果添加前缀java:global,则直接在 JNDI 全局命名空间中声明了名称;您将能够使用相同的名称直接在该名称空间中查找您的 bean java:global/AltServer:。是的,您仍然应该能够在其他命名空间中访问它 - 请参见第一段。

你问:“我已经在我的会话 bean 中使用了 @EJB 注释来指定一个名称,就像我在上面链接的常见问题解答中解释的那样,我不确定当 EJB 是 EAR 的一部分时它是否合适。有人知道吗?”

没关系,这完全取决于你想要什么。像所有命名空间一样,人们可能会考虑避免过度填充命名空间——尤其是全局命名空间。考虑片刻,然后做出决定 - 并准备好在需要时重新考虑:-)

于 2012-08-08T16:07:38.380 回答