【问题标题】:Glassfish v3 / JNDI entry cannot be found problems!Glassfish v3/JNDI 入口找不到问题!
【发布时间】:2010-01-18 17:33:09
【问题描述】:

我在尝试从 Java 应用程序客户端调用 EJB 方法时遇到问题。 这是代码。

EJB 远程接口

package com.test;

import javax.ejb.Remote;

@Remote
public interface HelloBeanRemote {

    public String sayHello();

}

EJB

package com.test;

import javax.ejb.Stateless;

@Stateless (name="HelloBeanExample" , mappedName="ejb/HelloBean")
public class HelloBean implements HelloBeanRemote {

    @Override
    public String sayHello(){

        return "hola";

    }

}

主类(另一个项目)

import com.test.HelloBeanRemote;
import javax.naming.Context;
import javax.naming.InitialContext;

public class Main {


    public void runTest()throws Exception{

        Context ctx = new InitialContext();
        HelloBeanRemote  bean = (HelloBeanRemote)ctx.lookup("java:global/Test/HelloBeanExample!com.test.HelloBeanRemote");
        System.out.println(bean.sayHello());

    }


    public static void main(String[] args)throws Exception {

        Main main = new Main();
        main.runTest();

    }

}

好吧,我的问题是什么?找不到此 EJB 的 JNDI 条目!

java.lang.NullPointerException
        at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:297)
        at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:271)
        at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:430)
        at javax.naming.InitialContext.lookup(InitialContext.java:392)
        at testdesktop.Main.runTest(Main.java:22)
        at testdesktop.Main.main(Main.java:31) Exception in thread "main" javax.naming.NamingException: Lookup failed for 'java:global/Test/HelloBeanExample!com.test.HelloBeanRemote' in SerialContext  [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext  [Root exception is java.lang.NullPointerException]]
        at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:442)
        at javax.naming.InitialContext.lookup(InitialContext.java:392)
        at testdesktop.Main.runTest(Main.java:22)
        at testdesktop.Main.main(Main.java:31) Caused by: javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext  [Root exception is java.lang.NullPointerException]
        at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:276)
        at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:430)
        ... 3 more Caused by: java.lang.NullPointerException
        at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:297)
        at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:271)
        ... 4 more Java Result: 1

我尝试了不同的 JNDI 条目,但没有任何效果(我从 NetBeans 控制台获得了这些条目):

INFO:EJB HelloBeanExample 的可移植 JNDI 名称:[java:global/Test/HelloBeanExample, java:global/Test/HelloBeanExample!com.test.HelloBeanRemote]

信息:EJB HelloBeanExample 的 Glassfish 特定(非便携式)JNDI 名称:[ejb/HelloBean, ejb/HelloBean#com.test.HelloBeanRemote]

所以我尝试了以下条目,但我得到了同样的例外:

  1. java:global/Test/HelloBeanExample
  2. java:global/Test/HelloBeanExample!com.test.HelloBeanRemote
  3. ejb/HelloBean
  4. ejb/HelloBean#com.test.HelloBeanRemote

我正在使用 Netbeans 6.8 和 Glassfish v3!

【问题讨论】:

    标签: java glassfish ejb-3.0 jndi glassfish-3


    【解决方案1】:

    实际上,您的问题不是查找您的 bean 的 JNDI 引用,否则您会得到类似的结果:

    Caused by: javax.naming.NameNotFoundException: ejb/HelloBean not found
    

    不,在这里,我怀疑是一个简单的类路径问题,您只是在客户端项目的类路径中缺少一些 jar。使用 GlassFish v3,添加 $GF_HOME/modules/gf-client.jar 就足够了,正如 GlassFish 的 EJB 常见问题解答中的 How do I access a Remote EJB component from a stand-alone java client? 中提到的那样(我的理解是这个 jar 应该替换 $GF_HOME/lib/appserv-rt.jar,这是出于与 GFv2 的兼容性原因)。但是,请务必从 GlassFish 安装目录中引用 gf-client.jar,否则将找不到在其清单中声明的​​ jar。

    gf-client.jar 引用 GlassFish 安装目录中的许多其他 .jar,因此最好从安装目录本身引用它,而不是将其(以及所有其他 .jar)复制到另一个位置。

    一旦您解决了这个问题,您应该能够使用 GlassFish 在日志中输出的 JNDI 名称来查找您的 bean。我建议使用 Java EE 6 中新的可移植全局 JNDI 名称。

    以防万一,GlassFish EJB FAQ 中的What is the syntax for portable global JNDI names in EJB 3.1? 条目很好地总结了这一新约定。如果您想了解更多信息,请查看:http://blogs.oracle.com/MaheshKannan/entry/portable_global_jndi_names

    【讨论】:

      【解决方案2】:

      我发现了一些东西!我认为有一种“特殊方式”可以使用 NetBeans 添加和配置组件!我一直在从网页上阅读 netbeans 的教程,显然我做错了!因此,这不是解决此问题的真正解决方案,但也许如果您阅读其中一个http://netbeans.org/kb/trails/java-ee.html,您会找到答案!

      问候

      【讨论】:

        【解决方案3】:

        我也遇到了同样的问题。我在网上用谷歌搜索,并逐行按照 Oracle 的教程设置了一个独立的 Java 客户端,但仍然没有任何效果。我遇到了http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html,它包含我已经尝试解决问题的信息。

        我将重新启动我的 IDE,清理并构建项目;也可以重新创建项目。谁知道,当满月时,我的代码可能会运行良好 :) 所以可能也想尝试一下

        【讨论】:

          【解决方案4】:

          我的独立客户端终于运行了!诀窍是,只需重新启动 Netbeans IDE,取消部署应用程序并重新部署它。这应该可以解决您的问题(假设您的代码和配置中没有其他错误)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-08-08
            • 1970-01-01
            • 2018-09-18
            • 2011-01-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-21
            相关资源
            最近更新 更多