Glassfish v3/JNDI入门无法找到问题!

rud*_*tos 9 java jndi glassfish ejb-3.0 glassfish-3

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

EJB远程接口

package com.test;

import javax.ejb.Remote;

@Remote
public interface HelloBeanRemote {

    public String sayHello();

}
Run Code Online (Sandbox Code Playgroud)

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";

    }

}
Run Code Online (Sandbox Code Playgroud)

主类(另一个项目)

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();

    }

}
Run Code Online (Sandbox Code Playgroud)

那么,我的问题是什么?无法找到此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
Run Code Online (Sandbox Code Playgroud)

我尝试使用不同的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的:全球/测试/ HelloBeanExample
  2. Java的:全球/测试/ HelloBeanExample com.test.HelloBeanRemote
  3. EJB /为helloBean
  4. EJB /为helloBean#com.test.HelloBeanRemote

我正在使用Netbeans 6.8和Glassfish v3!

Pas*_*ent 17

实际上,你的问题不是查找你的bean的JNDI引用,或者你会得到类似的东西:

Caused by: javax.naming.NameNotFoundException: ejb/HelloBean not found
Run Code Online (Sandbox Code Playgroud)

不,在这里,我怀疑一个简单的类路径问题,你只是在客户端项目的类路径上缺少一些jar.使用GlassFish v3,如何从独立的Java客户端访问远程EJB组件中$GF_HOME/modules/gf-client.jar提到的添加应该足够了?在GlassFish的EJB FAQ中(我的理解是这个jar应该替换$GF_HOME/lib/appserv-rt.jar出与GFv2兼容的原因).然而,重要的是gf-client.jar从GlassFish安装目录中引用它,或者找不到在其清单中声明的​​jar.

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

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

以防万一,EJB 3.1中可移植全局JNDI名称的语法什么?GlassFish EJB FAQ中的条目提供了这个新约定的一个很好的总结.如果您想了解更多信息,请查看:http://blogs.oracle.com/MaheshKannan/entry/portable_global_jndi_names.