2013-05-10 49 views
6

Tôi mới dùng EJB và đang thử loại chương trình Java "Hello World" "Hello World". Dưới đây là EJB của tôi:EJB - Tìm kiếm thất bại cho 'ejb/BookRequestBean'

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

và đây là khách hàng của tôi:

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

Nhưng bất cứ khi nào tôi cố gắng chạy, tôi nhận được dưới đây ngoại lệ:

javax.naming.NamingException: Không thể tìm kiếm 'ejb/BookRequestBean' trong SerialContext [myEnv = {org.omg.CORBA.ORBInitialPort = 3700, java.naming.factory.initial = com.sun.enterprise.naming.SerialInitContextFactory, org.omg.CORBA.ORBInitialHost = localhost, java

Tôi đã thêm appserv-rt.jar, gf-client.jar, javaee.jar, nhưng vẫn không có may mắn. Bất cứ ai có thể giúp tôi, những gì tôi đang thiếu ở đây? Tôi usign Glassfish 3.1

+0

Toàn bộ stacktrace sẽ giúp ích. Hãy chắc chắn rằng bạn cũng xem xét điều này: http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#POJOLocalEJB – LMeyer

Trả lời

2

Ngoài câu trả lời @RaviTrivedi đẹp, sau đây là vài suy nghĩ:

  • @Named chú thích không nên được sử dụng theo cách này
  • không sử dụng cả hai namemappedName, cho Glassfish nó là đủ để sử dụng chỉ mappedName
  • EJB bạn nên thực hiện giao diện từ xa
+0

Giảm nhẹ. 'name' được sử dụng để nhận dạng EJB trong khi' mappedName' là tên JNDI của EJB. Ngoài ra 'mappedName' là nhà cung cấp cụ thể. tức là: Glassfish hỗ trợ, Websphere không. –

+0

@RaviTrivedi Yep, đó là lý do tại sao tôi chú ý rằng nó đủ cho Glassfish. Nó không nên được sử dụng nếu bạn muốn các ứng dụng di động hoàn toàn. –

6

Có thể có nhiều lý do như sau:

1) bạn EJB không được ánh xạ tới JNDI tên. Bạn cần kiểm tra xem liệu EJB của bạn có được triển khai thành công hay không và được ánh xạ tới tên JNDI. Bạn có thể kiểm tra Server GUI, Server Log on startup hoặc sử dụng Universal Test Client để xem liệu EJB có được ánh xạ chính xác không. Lưu ý, UTC sẽ chỉ hiển thị Được tiếp xúc từ xa EJB.

2)EJB của bạn chỉ được tiếp xúc với Ứng dụng địa phương. Trong trường hợp này, Cuộc gọi từ xa hoặc Gọi qua ứng dụng (EAR khác, WAR ...) đến EJB của bạn sẽ không thành công. Trong trường hợp này, hãy tạo Giao diện từ xa và hiển thị nó. Giao diện cục bộ chỉ hiển thị EJB cho các cuộc gọi nội hạt. Giao diện từ xa hiển thị EJB đến điều khiển từ xa hoặc qua ứng dụng chéo.

3)RMI/IIOPcổng của bạn có thể không chính xác. Bạn có thể kiểm tra Glassfish GUI hoặc Server startup log để xem những gì cổngRMI/IIOP được chỉ định.

Lưu ý: Để chẩn đoán sự cố chính xác, vui lòng đăng theo dõi ngăn xếp đầy đủ.

+0

+1, cảm ơn câu trả lời :) –

+0

Đừng lo lắng, chúc mừng! –

2

Thêm vào @Ravi Trivedi và @Miljen Miki c, nếu bạn đang sử dụng Glassfish, bạn nên kiểm tra cách EJB của bạn được đăng ký trong JNDI. Trong Glassfish, hãy nhập lệnh sau:

asadmin list-jndi-entries 
+0

để xem EJB đăng ký trong JNDI với asadmin - tuyệt vời. – Thufir