Glassfish v3 / JNDI条目无法找到问题!

9

我一直在尝试从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]

INFO: 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!

4个回答

17

实际上,你的问题并不是查找bean的JNDI引用,否则你会得到类似于以下内容:

Caused by: javax.naming.NameNotFoundException: ejb/HelloBean not found
不,我怀疑是一个简单的类路径问题。你的客户端项目缺少一些jar文件。在GlassFish v3中,添加$GF_HOME/modules/gf-client.jar应该足够了,如GlassFish的EJB FAQ中所述,可以从How do I access a Remote EJB component from a stand-alone java client?链接中找到(我的理解是这个jar文件应该替换那个只为与GFv2兼容而存在的$GF_HOME/lib/appserv-rt.jar)。然而,请注意要从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

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

0

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

我将重新启动我的IDE,清理并构建项目;也许还要重新创建项目。谁知道呢,在月圆之夜,我的代码可能会运行得很好:) 所以你也可以试试。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接