2013-02-18 38 views
5

Tôi đang sử dụng lớp Bean sau:JNDI lookup không làm việc với 3.x EJB

@Stateless(name="UserBean", mappedName="UserBean") 
@LocalBean 
public class User implements UserRemote { 

@PersistenceContext 
private EntityManager em; 

public User() { 

} 

public String login(String username, String password) { 

    Query query = em.createQuery("..."); 
    return "xyz"; 
} 

} 

Và phương pháp của tôi là

public String myMethod() { 

    try { 
     User user = (User) new InitialContext().lookup("UserBean"); 
     return "xyz"; 
    } catch (NamingException e) { 
     e.printStackTrace(); 
    } 
    return null;   
} 

Ở đây tôi nhận được một

javax.naming.NameNotFoundException: Unable to resolve 'UserBean'. Resolved ''; remaining name 'UserBean' 

Tên tra cứu JNDI 'UserBean' có vẻ đúng. Không biết vấn đề là gì. Có ai giúp đuợc không? Tôi đã triển khai ứng dụng của mình trên weblogic 12c, sử dụng JPA 2.0 và EJB 3.x

Cảm ơn bạn trước.

Trả lời

4

Vấn đề là tôi đã sử dụng một giao diện từ xa. Chỉ sử dụng chú thích @stateless mà không có tên ánh xạ Mã sau đã hoạt động:

new InitialContext().lookup("java:global/ProjectName/ModuleName/BeanName!FullyQualif‌​iedNameOfRemoteInterface"); 

Cảm ơn @Andre!

1

Nó có thể là một ý tưởng tốt hơn để tận dụng của Portable JNDI Name, nghĩa là chỉ chú thích với @Stateless

https://blogs.oracle.com/kensaks/entry/application_specified_portable_jndi_names

+0

Tôi đã thử với chú thích như chỉ '@Stateless'. Tên EAR của tôi là Aahar_v.0.1 và tên EJB Module của tôi là Aahar_EJB_v.0.1, vì vậy tôi đã thử tên JNDI là 'java: Aahar_v.0.1/Aahar_EJB_v.0.1/User' và tôi vẫn nhận được 'javax.naming.NameNotFoundException : Không thể giải quyết 'java: global.Aahar_v.0.1.Aahar_EJB_v.0.1.User'. Đã giải quyết 'java: global.Aahar_v.0.1.Aahar_EJB_v.0.1'; tên còn lại 'Người dùng' ' Tôi có làm gì sai không? – Aditya

+0

Bạn có cần một giao diện từ xa, tức là bạn cần tìm kiếm bên ngoài máy chủ ứng dụng? Nếu không, hãy thả giao diện – Andre

+0

Vấn đề là tôi đang sử dụng Giao diện Từ xa. Sử dụng đơn giản chỉ là chú thích @Stateless mà không cần ánh xạ tên Các mã sau đây làm việc: mới lookup() InitialContext ("java: toàn cầu/ProjectName/môđun/BeanName FullyQualifiedNameOfRemoteInterface."); Cảm ơn @Andre! – Aditya

1

Mặc dù câu hỏi này đã được trả lời hai năm trước, tôi muốn thêm nhận xét về điều này. Sẽ không có vấn đề gì khi sử dụng thuộc tính mappedName. Nếu bạn đang triển khai trên WebLogic, bạn phải thêm #[fully.qualified.interface.name] vào tra cứu của mình.

ví dụ: mappedName = "UserBean", các EJB đang thực hiện một giao diện mang tên MyInterface trong com.acme.user gói, sau đó tra cứu sẽ như thế nào

... = new InitialContext().lookup("UserBean#com.acme.user.MyInterface"); 
Các vấn đề liên quan