2010-01-18 18 views
8

Tôi đã gặp sự cố khi cố gắng gọi phương thức EJB từ Ứng dụng khách Java. Đây là mã.Glassfish v3/JNDI nhập cảnh không thể được tìm thấy vấn đề!

EJB từ xa Interface

package com.test; 

import javax.ejb.Remote; 

@Remote 
public interface HelloBeanRemote { 

    public String sayHello(); 

} 

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

    } 

} 

lớp Main (một dự án khác)

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

    } 

} 

Vâng, vấn đề của tôi là gì? Không thể tìm thấy mục nhập JNDI cho EJB này!

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 

Tôi đã cố gắng với mục JNDI khác nhau nhưng không làm việc (tôi nhận này mục từ NetBeans console):

INFO: tên JNDI xách tay cho EJB HelloBeanExample: [java: toàn cầu/Kiểm tra/HelloBeanExample, java: toàn cầu/Kiểm tra/HelloBeanExample com.test.HelloBeanRemote]

INFO: Glassfish cụ thể (Non-portable) tên JNDI cho EJB HelloBeanExample: [ejb/HelloBean, ejb/HelloBean # com.test.HelloBeanRemote]

Vì vậy, tôi đã thử với entri sau es nhưng tôi có cùng một ngoại lệ:

  1. java: toàn cầu/Kiểm tra/HelloBeanExample
  2. java: toàn cầu/Kiểm tra/HelloBeanExample com.test.HelloBeanRemote
  3. ejb/HelloBean
  4. ejb/HelloBean # com.test.HelloBeanRemote

Tôi đang sử dụng Netbeans 6.8 và Glassfish v3!

Trả lời

17

Trên thực tế, vấn đề của bạn là không tra cứu các tài liệu tham khảo JNDI của đậu của bạn hoặc bạn sẽ nhận được một cái gì đó như thế:

Caused by: javax.naming.NameNotFoundException: ejb/HelloBean not found 

Không, ở đây, tôi nghi ngờ một vấn đề classpath đơn giản, bạn chỉ đơn giản là thiếu một số lọ trên classpath của dự án khách hàng của bạn. Với GlassFish v3, thêm $GF_HOME/modules/gf-client.jar phải đủ như đã đề cập trong How do I access a Remote EJB component from a stand-alone java client? trong Câu hỏi thường gặp về EJB của GlassFish (sự hiểu biết của tôi là bình này được cho là thay thế $GF_HOME/lib/appserv-rt.jar có lý do tương thích với GFv2). Tuy nhiên, điều quan trọng là phải tham khảo gf-client.jar từ thư mục cài đặt GlassFish hoặc các lọ được khai báo trong tệp kê khai của nó sẽ không được tìm thấy.

gf-client.jar đề cập đến nhiều .jars khác từ thư mục cài đặt GlassFish vì vậy tốt nhất để đề cập đến nó từ bên trong thư mục cài đặt riêng của mình chứ không phải là sao chép nó (và tất cả các .jars khác) đi nơi khác.

Khi bạn đã sửa lỗi này, bạn sẽ có thể tra cứu hạt của mình bằng cách sử dụng tên JNDI mà đầu ra GlassFish trong nhật ký. Tôi muốn đề nghị sử dụng tên JNDI toàn cầu di động mới từ Java EE 6.

Chỉ trong trường hợp, mục nhập What is the syntax for portable global JNDI names in EJB 3.1? từ Câu hỏi thường gặp về GlassFish EJB cung cấp tóm tắt tốt đẹp về quy ước mới này. Và nếu bạn muốn biết thêm thông tin, hãy xem: http://blogs.oracle.com/MaheshKannan/entry/portable_global_jndi_names.

0

Tôi đã tìm thấy thứ gì đó! Tôi nghĩ rằng có một "cách đặc biệt" để thêm và cấu hình các thành phần bằng cách sử dụng NetBeans! Tôi đã đọc hướng dẫn của netbeans từ các trang web và dường như tôi đã làm những điều sai trái! Vì vậy, đây không phải là một giải pháp thực sự cho vấn đề này nhưng có lẽ nếu bạn đọc một trong những http://netbeans.org/kb/trails/java-ee.html bạn sẽ tìm thấy aswers của bạn!

Kính trọng

0

Tôi đã gặp phải vấn đề tương tự. Tôi googled trang web và làm theo hướng dẫn từ dòng Oracle để thiết lập một trình khách java độc lập nhưng vẫn không có gì hoạt động. Tôi đã xem qua số http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html và có thông tin mà tôi đã cố gắng giải quyết vấn đề.

Tôi sẽ chỉ khởi động lại IDE, làm sạch và xây dựng dự án; cũng có thể tạo ra các dự án afresh. Và ai biết được, khi mặt trăng đã đầy, mã của tôi có thể chạy tốt :) Vì vậy, có thể muốn thử điều đó quá

0

Ứng dụng khách độc lập của tôi cuối cùng cũng chạy! Bí quyết là, chỉ cần khởi động lại Netbeans IDE, không triển khai ứng dụng và triển khai lại nó. Điều này sẽ khắc phục sự cố của bạn (giả sử không có lỗi nào khác trong mã và cấu hình của bạn).