2013-05-10 90 views
6

我是新來的EJB,並嘗試使用「Hello World」類型的EJB Java程序。這裏是我的EJB:EJB - 查找失敗的'ejb/BookRequestBean'

package dukesbookstore.ejb; 
@Stateless(name="BookRequestBean", mappedName="ejb/BookRequestBean") 
@Named 
public class BookRequestBean { 
    //Other codes here 
} 

,這裏是我的客戶:

Properties prop = new Properties(); 
    prop.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory"); 
    prop.setProperty("org.omg.CORBA.ORBInitialHost", "localhost"); 
    prop.setProperty("org.omg.CORBA.ORBInitialPort", "3700"); 
    try { 
     InitialContext ctx = new InitialContext(prop);        
     ctx.lookup("ejb/BookRequestBean"); 
     System.out.println("EJB Look-up successfull!!"); 
    } catch (NamingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

但每當我嘗試運行,我得到以下異常:

javax.naming.NamingException中:查找在SerialContext中'ejb/BookRequestBean'失敗[myEnv = {org.omg.CORBA.ORBInitialPort = 3700,java.naming.factory.initial = com.sun.enterprise.naming.SerialInitContextFactory,org.omg.CORBA.ORBInitialHost = localhost,java

我已添加appserv-rt.jar,gf-client.jarjavaee.jar,但仍然沒有運氣。任何人都可以幫助我,我在這裏錯過了什麼?我usign Glassfish的3.1

+0

Full stacktrace將有所幫助。確保你也看看這個:http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#POJOLocalEJB – LMeyer 2013-05-10 21:15:37

回答

2

除了漂亮@RaviTrivedi答案,這裏有一些想法:

  • @Named註釋不應該使用這種方式
  • 不要同時使用namemappedName,對於GlassFish就足夠了只使用mappedName
  • 您的EJB應該實現遠程接口
+0

輕微嘆息。 'name'用於標識EJB,而'mappedName'則是EJB的JNDI名稱。 'mappedName'也是供應商特定的。即:Glassfish支持,Websphere不支持。 – 2013-05-13 09:48:15

+0

@RaviTrivedi是的,這就是爲什麼我指出它對Glassfish來說已經足夠了。如果您需要完全便​​攜式應用程序,則不應使用它。 – 2013-05-13 09:51:09

6

可以有幾個理由如下:

1)EJB沒有映射到JNDI名稱。您需要檢查您的EJB是否已成功部署,並將其映射到JNDI名稱。您可以檢查Server GUI,Server Log on startup或使用Universal Test Client查看EJB映射是否正確。請注意,UTC將只顯示遠程暴露的 EJB。

2)EJB僅暴露於本地應用。在這種情況下,遠程呼叫跨應用程序調用(不同的EAR,WAR ...)到您的EJB將失敗。在這種情況下,創建遠程接口並將其公開。 本地接口僅將EJB公開給本地調用。 遠程接口將EJB公開到遠程跨應用程序調用

3)RMI/IIOP端口可能不正確。您可以檢查Glassfish GUIServer startup log以查看端口RMI/IIOP是分配給哪個端口。

注意:要診斷確切的問題,請張貼完整的堆棧跟蹤。

+0

+1,謝謝你的回答:) – 2013-05-13 12:17:56

+0

不用擔心隊友,歡呼! – 2013-05-13 14:48:49

2

添加到@Ravi特里維迪和@Miljen三木c,如果你使用Glassfish,你應該檢查你的EJB是如何在JNDI中註冊的。例如,在Glassfish中鍵入以下命令:

asadmin list-jndi-entries 
+0

可以看到EJB在JNDI中註冊了asadmin - 非常出色。 – Thufir 2017-11-06 08:05:46