2013-02-18 76 views
5

我用下面的Bean類工作:JNDI查找不與EJB 3.x的

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

} 

而且我的方法是

public String myMethod() { 

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

在這裏我得到一個

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

JNDI查找名稱'UserBean'似乎是正確的。不知道問題是什麼。任何人都可以幫忙嗎?我已經在weblogic 12c上部署了我的應用程序,使用JPA 2.0和EJB 3.x

在此先感謝。

回答

4

註釋的問題是我使用的是遠程接口。使用簡單的@stateless註釋而沒有映射名稱下面的代碼工作:

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

謝謝@Andre!

1

這可能是一個更好的主意,利用便攜式JNDI名稱,即只是@Stateless

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

+0

我與註釋爲只是「@無狀態」嘗試。 我的EAR名稱是Aahar_v.0.1,我的EJB模塊名稱是Aahar_EJB_v.0.1,所以我嘗試將JNDI名稱命名爲'java:Aahar_v.0.1/Aahar_EJB_v.0.1/User',而我仍然得到'javax.naming.NameNotFoundException :無法解析'java:global.Aahar_v.0.1.Aahar_EJB_v.0.1.User'。已解決'java:global.Aahar_v.0.1.Aahar_EJB_v.0.1';剩餘名稱'用戶' 我做錯了什麼? – Aditya 2013-02-18 16:09:26

+0

您是否需要遠程接口,即是否需要在應用程序服務器之外進行查找?如果沒有,請刪除界面 – Andre 2013-02-18 16:44:26

+0

問題是我正在使用遠程接口。 使用簡單的@Stateless註釋不映射名稱 下面的代碼工作: 新的InitialContext()查詢( 「java的:全球/項目名/模塊名/ BeanName FullyQualifiedNameOfRemoteInterface」)。 謝謝@Andre! – Aditya 2013-02-18 17:06:05

1

雖然這個問題已在兩年前得到解答,但我想對此加以評論。 使用mappedName屬性應該沒有問題。如果您在WebLogic上部署,則必須在查找中添加#[fully.qualified.interface.name]

例如mappedName = "UserBean",的EJB正在實施一個名爲MyInterface的在包裝com.acme.user的接口,然後查找會是什麼樣

... = new InitialContext().lookup("UserBean#com.acme.user.MyInterface");