2013-03-06 67 views
2

我正在通過EJB 3.1 spec,並試圖掌握JNDI調用的不同可能方式。EJB容器內可能的JNDI查找

您可以使用SessionContextInitialContext(或基於Initial-或SessionContext的自創環境)來完成。 基於你使用的語法不同,但我似乎無法找到它背後的邏輯。

所以我的問題是:什麼時候可以使用什麼語法來在EJB容器環境中使用JNDI調用?

這個問題的其餘部分只是爲了說明我的觀點。

例如,我相信這是總是能正確注射sessioncontext或創建initialcontext

ctx.lookup(java:global[/<app-name>]/<module-name>/<bean-name>[!<fully-qualified-interface-name>]) 
ctx.lookup(java:comp/env ...) 
// special ones like these 
ctx.lookup("java:comp/UserTransaction"); 
ctx.lookup("java:comp/ORB"); 

有時(僅適用於會話上下文?)這個較短的版本是可能的:

ctx.lookup(<bean-name>); 

embedded environment中怎麼樣,只能使用global引用?

+0

我建議您閱讀本文的所有5個部分(http://thegreyblog.blogspot.com/2010/09/introduction-to-ejb-30-injection-and.html)博客條目。 – Arek 2013-03-11 21:51:45

+0

非常有幫助,謝謝! – Steven 2013-03-13 09:15:10

回答

2

我通常使用@EJB註釋在EJB容器內注入EJB。因此,JDNI查找由服務器在部署時完成。

例如JBOSS部署:

INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor](MSC服務線程1-2)JNDI綁定用於部署單元子部署命名testBean這個會話bean「MyEJB部署「MyProject.ear」的「.jar」如下所示:

java:global/MyProject/MyEJB/TestBean!my.project.TestBean 
java:app/MyEJB/TestEJB!my.project.TestBean 
java:module/TestEJB!my.project.TestBean 
java:global/MyProject/MyEJB/TestEJB 
java:app/MyEJB/TestBean 
java:module/TestBean 

一些是根據EJB規範,一些是依賴於應用程序服務器的。

如果您必須從上下文中查找,我認爲最好的方法是使用java:global

您還可以找到一些額外的信息:http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#POJOLocalEJB

2

JNDI有點像一個文件系統。您可以根據您在樹中的位置(您「cd」到的位置)使用相對路徑來引用事物。

注入的會話上下文默認情況下是「定位」在java:comp上的,所以你可以參考java:comp中提供的東西,而不需要提供「完整路徑」。

請注意,java:comp本身是相對於單個EJB bean,或者是由於整個Web模塊的歷史原因。

我並不是100%確定你對嵌入式環境的意義,但是如果你從事的JNDI查找代碼不是任何預定義範圍的一部分(如java:module,java:app等)只有java:global可以被輕易使用。