2011-07-26 72 views
3

夥計們,的JBoss 6:注射EJB成servlet

我具有重新學習和浪費時間這個東西每個JBoss的一個新版本的推出時間周圍很惱火。

我有一個發現,並宣佈在JNDI空間中的無狀態EJB:

10:01:53,044 INFO [org.jboss.ejb3.proxy.impl.jndiregistrar.JndiSessionRegistrarBase] Binding the following Entries in Global JNDI: 

DTalk/UserManager/local - EJB3.x Default Local Business Interface 
DTalk/UserManager/local-com.doctalk.ejb.UserManagerLocal - EJB3.x Local Business Interface 

我需要一個servlet這是戰爭,是包含耳部分的一部分使用EJB EJB。我想用注射劑來做。

當我用最直觀的符號:

@EJB 
private UserManager userManager; 

我得到了JBoss的日誌例外。

當我使用一個更華麗的符號,如:

@EJB(mappedName = "UserManager") 
private UserManager userManager; 

或者

@EJB(mappedName = "DTalk/UserManager/local") // EAR is called DTalk 
private UserManager userManager; 

我沒有得到任何錯誤,注射在JBoss中,但注入的bean是空。

這是令人生氣和浪費時間,並讓我質疑爲什麼我不傾銷Eclipse/jboss工具專營權,以支持NetBeans和GlsssFish。

任何洞見讚賞。

謝謝。

+1

你似乎有各種需要被清理的誤解。你不願意重新學習的「新東西」獨立於JBoss。它們反映了新的Java規範。理論上,新版本的GlassFish將被更新爲支持與JBoss相同的新JSR。沒有人強迫你使用新版本的JBoss,對吧?另外,您不要將Eclipse/JBoss作爲一對,或者將NetBeans/GlassFish作爲一對。應用程序服務器可以與任何主要的IDE完全互操作。 –

+0

嗨馬特,感謝您的寫作。由於我做了無益的咆哮,我應該得到無益的迴應。不過,您對可與主要IDE進行互操作的應用程序服務器的評論有點理想。如果你喜歡這種類型的東西,或者說把你的耳朵釘在牆上,他們*可能會*互相合作。話雖如此,你有答案給我,還是隻有咆哮? – Raj

+0

使用最簡單的'@EJB private UserManager userManager;'注入時會出現什麼異常? –

回答

5

您正試圖向bean實例本身(而不是其接口)注入(代理)。

但是,根據您已經顯示的部署日誌記錄,您只通過其(本地)接口聲明bean在JNDI中是有界的。爲了使注射發生,您應該聲明中,你注入作爲接口變量:

@EJB 
private UserManagerLocal userManager; 

或宣佈一個no-interface視圖應該爲你的bean創建:

@Stateless 
@LocalBean 
public class UserManager implements UserManagerLocal { 
    ... 
} 

之後,您可以根據您前面所做的聲明變量:

@EJB 
private UserManager userManager; 
+0

Arjan,感謝您提供非常準確和直接的答案。你遇到了根本原因:我指的是bean類而不是接口。也感謝讓我意識到EJB3.1無界面視圖。我也會檢查一下。 – Raj