2015-05-13 89 views
8

我知道java:comp/env是JNDI樹中的一個節點,您可以在其中找到當前Java EE組件(webapp或EJB)的屬性,並且我知道每個EJB都有自己的組件環境,也有java:globaljava:appjava:module取決於我有一些問題
什麼是java:comp/env作用域規則?

  1. 當我使用Context envContext = (Context)initContext.lookup("java:comp/env");得到什麼調用initContext究竟背景下,我得到(全局,應用程序,模塊,Web應用程序或EJB上下文)?
  2. 是否有某些規則適用於搜索不同範圍?
  3. 假設我有許多EJB的Web應用程序,這是否意味着我有許多初始上下文(一個用於WebApp,一個用於每個EJB),或者所有這些資源都以某種方式收集在一個上下文中java:comp/env

很多謝謝。

回答

1
  1. 當我使用Context envContext =(Context)initContext.lookup(「java:comp/env」);獲取initContext什麼上下文正是我得到的(全局,應用程序,模塊,WebApp或EJB上下文)?

從TomEE文檔http://tomee.apache.org/lookup-of-other-ejbs-example.html

引用在web應用程序中,Java:comp/env的命名空間由所有servlet共享。 這基本上相當於給Java:Java EE中模塊命名空間 6.瞭解有在這裏定義了衝突,並且爲EJB,JAVA:COMP處於組件(EJB本身)而不是 模塊與web應用範圍的。

  1. 是否存在應用於搜索不同範圍的特定規則?

從JavaEE的6教程引用http://docs.oracle.com/cd/E19798-01/821-1841/girgn/index.html

化java:全局JNDI名稱空間是找到使用JNDI查找遠程 企業Bean的可移植的方式。使用java:module命名空間 在同一個模塊中查找本地企業bean。該 的java:應用程序命名空間用來查找同一個應用程序中封裝的 本地企業Bean。也就是說,企業bean在包含多個Java EE模塊的EAR文件中打包爲 。

  • 比方說,我有很多EJB的Web應用程序,這是否意味着我有很多初始上下文(一個用於Web應用程序,併爲每個EJB)或所有這些資源都以某種方式收集在一個上下文java:comp/env?
  • 基於上述鏈接,您將沒有很多上下文。

    0
    1. 當我使用上下文envContext =(上下文)initContext.lookup( 「Java的:comp/env的」);獲取initContext什麼上下文正是我得到的(全局,應用程序,模塊,WebApp或EJB上下文)?

    你得到你所問的人,你準確地描述爲「當前的Java EE組件(web應用程序,或EJB)」的一個。

    1. 是否存在應用於搜索不同範圍的特定規則?

    您在您指定的範圍內搜索。我不知道你的問題可能意味着什麼。

  • 比方說,我有很多EJB的Web應用程序,這是否意味着我有很多初始上下文(一個用於Web應用程序,併爲每個EJB)或所有這些資源都以某種方式收集在一個上下文java:comp/env?
  • 這個問題沒有意義。您創建的數量爲InitialContexts。他們是對象。 它們所指的取決於你在之內InitialContext。如果你繼續查找"the current Java EE component (a webapp, or an EJB)",你會繼續得到。所有'這些資源'分別以他們自己的名字'收集',java:comp/env

    +0

    感謝EJP。第一個問題和第三個問題,我的意思是,Web應用程序有IntialContext,另一個是EJB組件以及其他我不知道的其他問題。第二個問題我知道關於四個節點的java:comp/env''java:global''java:app''java:module''JNDI將查找資源的順序? –

    0

    就默認爲我所知的範圍將是全球

    1

    關於對java:comp/env在EJB的存在範圍問題3。

    傳統上(在JEE 6之前)java:comp/envwar模塊的模塊級別和jar模塊中的EJB的EJB級別。 在該模型中,必須爲每個單獨的EJB定義環境條目(通過resource-refenv-entry,ejb-jar.xml或資源引用,因爲JEE5可以在類級別使用@Resource)。

    <ejb-jar> 
        <enterprise-beans> 
        <session> 
         <ejb-name>B1</ejb-name> 
         <ejb-class>p1.B1</ejb-class> <!-- ejb-class should be skipped if bean is already defined via annotation --> 
         <env-entry> 
         <env-entry-name>entry1</env-entry-name>   
         <env-entry-type>java.lang.String</env-entry-type> 
         <env-entry-value>value1</env-entry-value 
         </env-entry> 
        </session> 
        </enterprise-beans> 
    </ejb-jar> 
    

    由於JEE 6,一個可以部署的EJB作爲war模塊的一部分。是否war模塊直接部署或是部分或ear模塊,它具有一個單一的java:comp/env命名空間的所有servlet,EJB和該模塊中的任何其它代碼之間共享。人們可以在web.xml定義環境條目:

    <web-app> 
        <env-entry> 
        <env-entry-name>entry1</env-entry-name>   
        <env-entry-type>java.lang.String</env-entry-type> 
        <env-entry-value>value1</env-entry-value 
        </env-entry> 
    </web-app> 
    

    在這種war基於模型,人們仍然可以有ejb-jar.xml配置EJB的其他方面,但env-entry對於一個給定的bean在ejb-jar.xml最終會注入所有的環境價值其他豆在war

    因此,我總是會使用war歸檔一切(可能打包在ear)。