EJB3 Glassfish JNDI查找

5
我正在使用捆绑了Glassfish的Eclipse IDE。我编写了一个简单的EJB应用程序,但它无法运行。
@Stateless
@Remote(CalculatorRemote.class) 
@Local(CalculatorLocal.class) 
public class Calculator implements CalculatorRemote, CalculatorLocal {
    @Override
    public String sayHello(String name) {
        System.out.println("ejb:"+name);
        return null;
    }
}

----

@Remote
public interface CalculatorRemote {
    public String sayHello(String name);

}
-------

@Local
public interface CalculatorLocal {
    public String sayHello(String name);
}

我写了一个独立的客户端进行测试,但失败了。找不到JNDI。
public class Main {

    public static void main(String[] args) throws Exception {        
        InitialContext ctx = new InitialContext();      
        CalculatorRemote bean = (CalculatorRemote) ctx.lookup("java:global/TestEAR/TEjb/Calculator!com.CalculatorRemote");
        bean.sayHello("Billy Bob");

    }

}

在服务器日志中,它显示:
INFO: Portable JNDI names for EJB Calculator : [java:global/TestEAR/TEjb/Calculator!com.CalculatorRemote, java:global/TestEAR/TEjb/Calculator!com.CalculatorLocal]
INFO: Glassfish-specific (Non-portable) JNDI names for EJB Calculator : [com.CalculatorRemote, com.CalculatorRemote#com.CalculatorRemote]

此外,我已尝试过。
ctx.lookup("com.CalculatorRemote")

依然不起作用。

错误信息为:

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 com.Main.main(Main.java:9)
Exception in thread "main" javax.naming.NamingException: Lookup failed for 'java:global/TestEAR/TEjb/Calculator!com.CalculatorRemote' 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 com.Main.main(Main.java:9)
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)
    ... 2 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)
    ... 3 more

请帮助我。

这是需要翻译的内容。
5个回答

3
你能否添加上述行:

  Properties props = new Properties();
 props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
 props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
 // glassfish default port value will be 3700,
props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
InitialContext ctx = new InitialContext(props);

 CalculatorRemote bean = (CalculatorRemote) ctx.lookup("java:global/TestEAR/TEjb/Calculator!    com.CalculatorRemote");

我在这里使用EJB3x和Glassfish v3创建了一个博客帖子。 http://anirbanchowdhury.wordpress.com/2012/06/07/ejb-3-application-in-glassfish-3x/


0

解决方案如下。

在下面的代码中,您必须调用另一个JVM中的bean,对吧?例如,您的主类在JRE中,而BEAN在Glassfish JVM中。


public class Main {

    public static void main(String[] args) throws Exception {        
        InitialContext ctx = new InitialContext();      
        CalculatorRemote bean = (CalculatorRemote) ctx.lookup("java:global/TestEAR/TEjb/Calculator!com.CalculatorRemote");
        bean.sayHello("Billy Bob");
    }
}

当它查找上下文时,您如何指定IP地址或URL?也就是说,“上下文”查找发生在哪里? - Thufir

0

今天我遇到了这个问题。

你的独立客户端失败了,但它将在GF EJB容器中工作。

为了进行客户端测试,您需要两件事才能使其正常工作:

  1. 从GlassFish_install_folder\glassfish\lib获取javaee、gf-client和appserv-rt jars。最后一个包含jndi.prop,因此您可以使用默认c-tor InitialContext();
  2. 从GlassFish_install_folder\glassfish\modules获取所有的jars。

这些jars需要在您的类路径中。这很傻,但我还不知道从2)中最少的jars是什么,以使其正常工作。


0

我认为异常是因为您没有正确配置初始上下文而抛出的。要么创建一个jndi.properties文件,要么创建一个带有属性的哈希表并将其发送到IntialContext构造函数。

使用Netbeans和Glassfish创建EJB3


0
  1. 你的大部分代码都是正确的,问题在于客户端,由于你有本地和远程接口,我已经在客户端中添加了我的评论,希望它很容易理解。还有...
  2. 添加了EJB @javax.ejb.Stateless(name = "CalculatorEJB") //这是可移植的,没有供应商锁定。另一种选择是mappedName,我认为更加针对weblogic和glassfish。
  3. 确保你的class路径中有client.jar。
  4. 我已经在glassfish容器中部署了EJB,一旦ear成功部署,运行客户端。
  5. 除了下面的代码,你不需要任何其他配置。这段代码是可移植的,应该可以在大多数容器上工作,但惊喜总是让人兴奋,请按原样运行并让我知道结果......

==============================

  1. 远程接口

包 com.au.ejbs;

import javax.ejb.Local;
    
@Local
public interface CalculatorLocalI {
     String sayHello(String name);
}

package com.au.ejbs;

import javax.ejb.Remote;

@Remote
public interface CalculatorRemoteI {
    String sayHello(String name);
}


=================================
2. The Impl


package com.au.ejbs;

@javax.ejb.Stateless(name = "CalculatorEJB") //Added this is portable instead of using mappedName
public class Calculator implements CalculatorRemoteI, CalculatorLocalI {
    @Override
    public String sayHello(String name) {
        return  "ejb:"+name;
    }
}



======================================
3. The client


package com.au.clients;


import com.au.ejbs.CalculatorRemoteI;

import javax.naming.InitialContext;

public class CalculatorT {

    public static void main(String[] args) throws Exception {
        InitialContext ctx = new InitialContext();
        CalculatorRemoteI bean = (CalculatorRemoteI) ctx.lookup("java:global/ejb3_2_ear_exploded/ejb/CalculatorEJB!com.au.ejbs.CalculatorRemoteI");
        //portable syntax java:global/[ ear name]/[module name normally the jar name in my case ejb.jar within the ear, ejb3_2_ear_exploded]/name in ....javax.ejb.Stateless(name = "CalculatorEJB")/
        //Now since you have both local and remote interfaces so the extra after the bang ! symbol namely the explicit remote interface name.
        //if you had only 1 remote interface impl you will require only (CalculatorRemoteI) ctx.lookup("java:global/ejb3_2_ear_exploded/ejb/CalculatorEJB");
        System.out.println("===output==" +bean.sayHello("Billy Bob"));

    }

}

4. output
===output==ejb:Billy Bob

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