【问题标题】:Glassfish 3/EJB 3. Standalone java clientGlassfish 3/EJB 3. 独立的 java 客户端
【发布时间】:2012-08-08 14:59:04
【问题描述】:

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

感谢阅读。

【问题讨论】:

    标签: glassfish client ejb javabeans


    【解决方案1】:

    显然已部署 EAR/EJB。因此,打开 Glassfish 管理控制台,例如 https://&lt;host&gt;: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。是的,您应该仍然可以在其他命名空间中访问它 - 请参阅第一段。

    还有

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

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

    【讨论】:

    • 谢谢。我在我的 jndi 语法中做了一些安排,我得到了一些 CommunicationException,我通过在我的客户端中包含 app server-rt jar 文件来解决。它现在似乎可以工作:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2011-05-17
    • 2013-04-30
    • 2015-10-27
    • 2013-02-24
    • 1970-01-01
    相关资源
    最近更新 更多