2011-04-18 89 views
4

我正在使用Glassfish捆綁的Eclipse IDE。我寫了一個簡單的EJB應用程序。但它不起作用。EJB3 Glassfish JNDI查找

@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 

請幫助我。

回答

0
就在今天

我有這個問題。 您的獨立客戶端失敗,但它將在GF EJB容器內部工作。

對於客戶端測試,你需要兩件事情,使其工作:

  1. 從GlassFish_install_folder \ GlassFish的\ lib中獲得的JavaEE,GF-客戶端和的appserv-RT罐子。最後一個包含jndi.prop,所以你可以使用默認的c-tor InitialContext();
  2. from GlassFish_install_folder \ glassfish \ modules獲取所有jar文件。

這些罐子需要在你的類路徑中。這很愚蠢,但我還不知道2)中的最小罐子是否能夠工作。

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"); 
    } 
} 
+0

當它查找上下文時,如何指定IP地址或URL?也就是說,在哪裏查找上下文? – Thufir 2014-09-06 18:04:20

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的第三版。 http://anirbanchowdhury.wordpress.com/2012/06/07/ejb-3-application-in-glassfish-3x/