2015-04-26 163 views
0

我已經瀏覽了上述主題的所有帖子,但無法解決此問題。情況是這樣的:Tomcat JNDI資源無法訪問

1)我已經定義了一組在CONF資源/ server.xml中(的Tomcat GlobalNamingResources)8.0.20 2)I已經在Tomcat的CONF聲明ResourceLink/context.xml中 3)從Web應用程序中,我得到名稱不受約束的異常。

根據我的理解,在resource.xml中聲明的資源如果映射到ResourceLink中,則可以從上下文訪問,現在爲所有Web應用程序加載conf/context.xml,並且資源應該可用但他們不是。我錯過了什麼。

下面是這些文件:

例外

javax.naming.NameNotFoundException: Name [comp/env] is not bound in this Context 
. Unable to find [comp]. 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:818) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:166) 
    at org.apache.naming.SelectorContext.lookup(SelectorContext.java:157) 
    at javax.naming.InitialContext.lookup(InitialContext.java:417) 
    at com.hm.vigil.platform.db.DatabaseConnectionManager.<init>(DatabaseConnectionManager.java:40) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 

server.xml的

<Server port="8005" shutdown="SHUTDOWN"> 
    <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> 
    <!-- Security listener. Documentation at /docs/config/listeners.html 
    <Listener className="org.apache.catalina.security.SecurityListener" /> 
    --> 
    <!--APR library loader. Documentation at /docs/apr.html --> 
    <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> 
    <!-- Prevent memory leaks due to use of particular java/javax APIs--> 
    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> 
    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> 
    <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> 

    <!-- Global JNDI resources 
     Documentation at /docs/jndi-resources-howto.html 
    --> 
     <GlobalNamingResources> 
    <!-- Editable user database that can also be used by 
     UserDatabaseRealm to authenticate users 
    --> 
    <Resource name="UserDatabase" auth="Container" 
       type="org.apache.catalina.UserDatabase" 
       description="User database that can be updated and saved" 
       factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 
       pathname="conf/tomcat-users.xml" /> 

     <Resource name="pool/LDAP" 
        auth="Container" 
        type="com.hm.vigil.platform.ldap.LDAPConnectionManager" 
        factory="com.hm.vigil.platform.ldap.LDAPConnectionManager" 
        singleton="true" 
        closeMethod="closeLDAPConnectionManager"/> 

     <Resource name="platform/ZOOKEEPER" 
        auth="Container" 
        type="com.hm.vigil.platform.config.PlatformConfigManager" 
        factory="com.hm.vigil.platform.config.PlatformConfigManager" 
        singleton="true" 
        closeMethod="closeZookeeperConfigRetriever"/> 

     <Resource name="pool/DB_CLIENT" 
        auth="Container" 
        type="javax.sql.Datasource" 
        factory="com.hm.vigil.platform.db.DatabaseConnectionManager" 
        singleton="true" 
        closeMethod="closeDatabaseConnectionManager"/> 

     <Resource name="platform/client/CONFIG_MANAGER" 
        auth="Container" 
        type="com.hm.vigil.platform.config.ClientConfigManager" 
        factory="com.hm.vigil.platform.config.ClientConfigManager" 
        singleton="true" 
        closeMethod="closeClientConfigManager"/> 

     <Environment name="zooKeeperHost" 
        type="java.lang.String" 
        value="localhost" 
        override="false"/> 

     <Environment name="zookeeperPort" 
        type="java.lang.String" 
        value="2181" 
        override="false"/>              

    </GlobalNamingResources> 

    <!-- A "Service" is a collection of one or more "Connectors" that share 
     a single "Container" Note: A "Service" is not itself a "Container", 
     so you may not define subcomponents such as "Valves" at this level. 
     Documentation at /docs/config/service.html 
    --> 
    <Service name="Catalina"> 

    <!--The connectors can use a shared executor, you can define one or more named thread pools--> 
    <!-- 
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" 
     maxThreads="150" minSpareThreads="4"/> 
    --> 


    <!-- A "Connector" represents an endpoint by which requests are received 
     and responses are returned. Documentation at : 
     Java HTTP Connector: /docs/config/http.html (blocking & non-blocking) 
     Java AJP Connector: /docs/config/ajp.html 
     APR (HTTP/AJP) Connector: /docs/apr.html 
     Define a non-SSL/TLS HTTP/1.1 Connector on port 8080 
    --> 
    <Connector port="8080" protocol="HTTP/1.1" 
       connectionTimeout="20000" 
       redirectPort="8443" /> 
    <!-- A "Connector" using the shared thread pool--> 
    <!-- 
    <Connector executor="tomcatThreadPool" 
       port="8080" protocol="HTTP/1.1" 
       connectionTimeout="20000" 
       redirectPort="8443" /> 
    --> 
    <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443 
     This connector uses the NIO implementation that requires the JSSE 
     style configuration. When using the APR/native implementation, the 
     OpenSSL style configuration is required as described in the APR/native 
     documentation --> 
    <!-- 
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" 
       maxThreads="150" SSLEnabled="true" scheme="https" secure="true" 
       clientAuth="false" sslProtocol="TLS" /> 
    --> 

    <!-- Define an AJP 1.3 Connector on port 8009 --> 
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 


    <!-- An Engine represents the entry point (within Catalina) that processes 
     every request. The Engine implementation for Tomcat stand alone 
     analyzes the HTTP headers included with the request, and passes them 
     on to the appropriate Host (virtual host). 
     Documentation at /docs/config/engine.html --> 

    <!-- You should set jvmRoute to support load-balancing via AJP ie : 
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> 
    --> 
    <Engine name="Catalina" defaultHost="localhost"> 

     <!--For clustering, please take a look at documentation at: 
      /docs/cluster-howto.html (simple how to) 
      /docs/config/cluster.html (reference documentation) --> 

     <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> 


     <!-- Use the LockOutRealm to prevent attempts to guess user passwords 
      via a brute-force attack --> 
     <Realm className="org.apache.catalina.realm.LockOutRealm"> 
     <!-- This Realm uses the UserDatabase configured in the global JNDI 
      resources under the key "UserDatabase". Any edits 
      that are performed against this UserDatabase are immediately 
      available for use by the Realm. --> 
     <!-- <Realm className="org.apache.catalina.realm.UserDatabaseRealm" 
       resourceName="UserDatabase"/> --> 

     <Realm className="org.apache.catalina.realm.JNDIRealm" 
       connectionURL="ldap://localhost:10389" 
       connectionName="uid=admin,ou=system" 
       connectionPassword="secret" 
       userBase="cn=PLATFORM_CLIENTS,cn=PLATFORM_CONFIG,dc=example,dc=com" 
       userSubtree="true" 
       userSearch="(&amp;(objectClass=user)(email={0})(userClass=ACTIVE))" 
       userRoleName="userRole"/> 

     </Realm> 

     <Host name="localhost" appBase="webapps" 
      unpackWARs="true" autoDeploy="true"> 

     <!-- SingleSignOn valve, share authentication between web applications 
      Documentation at: /docs/config/valve.html --> 

     <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> 
     <Valve className="org.apache.catalina.ha.authenticator.ClusterSingleSignOn" /> 
     <!-- Access log processes all example. 
      Documentation at: /docs/config/valve.html 
      Note: The pattern used is equivalent to using pattern="common" --> 
     <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" 
       prefix="localhost_access_log" suffix=".txt" 
       pattern="%h %l %u %t &quot;%r&quot; %s %b" /> 

<!--   <Context> 
      <Environment name="zooKeeperHost" 
        type="java.lang.String" 
        value="localhost" 
        override="false"/> 

      <Environment name="zookeeperPort" 
        type="java.lang.String" 
        value="2181" 
        override="false"/> 
     </Context> --> 

     </Host> 
    </Engine> 
    </Service> 
</Server> 

context.xml中

<Context> 

    <!-- Default set of monitored resources. If one of these changes, the --> 
    <!-- web application will be reloaded.         --> 
    <WatchedResource>WEB-INF/web.xml</WatchedResource> 
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource> 

<!--  <Environment name="zooKeeperHost" 
        type="java.lang.String" 
        value="localhost" 
        override="false"/> --> 

     <ResourceLink name="zooKeeperHost" 
         global="zooKeeperHost" 
         type="java.lang.String"/>     

<!--  <Environment name="zookeeperPort" 
        type="java.lang.String" 
        value="2181" 
        override="false"/> --> 

     <ResourceLink name="zookeeperPort" 
         global="zookeeperPort" 
         type="java.lang.String"/> 

<!--   <Resource name="pool/LDAP" 
        auth="Container" 
        type="com.hm.vigil.platform.ldap.LDAPConnectionManager" 
        factory="com.hm.vigil.platform.ldap.LDAPConnectionManager" 
        singleton="true" 
        closeMethod="closeLDAPConnectionManager"/> --> 

     <ResourceLink name="pool/LDAP" 
         global="pool/LDAP" 
         type="com.hm.vigil.platform.ldap.LDAPConnectionManager"/> 

<!--   <Resource name="platform/ZOOKEEPER" 
        auth="Container" 
        type="com.hm.vigil.platform.config.PlatformConfigManager" 
        factory="com.hm.vigil.platform.config.PlatformConfigManager" 
        singleton="true" 
        closeMethod="closeZookeeperConfigRetriever"/> --> 

     <ResourceLink name="platform/ZOOKEEPER" 
         global="platform/ZOOKEEPER" 
         type="com.hm.vigil.platform.config.ZookeeperConfigRetriever"/> 

<!--   <Resource name="pool/DB_CLIENT" 
        auth="Container" 
        type="javax.sql.Datasource" 
        factory="com.hm.vigil.platform.db.DatabaseConnectionManager" 
        singleton="true" 
        closeMethod="closeDatabaseConnectionManager"/> --> 

     <ResourceLink name="pool/DB_CLIENT" 
         global="pool/DB_CLIENT" 
         type="javax.sql.Datasource"/> 

<!--   <Resource name="platform/client/CONFIG_MANAGER" 
        auth="Container" 
        type="com.hm.vigil.platform.config.ClientConfigManager" 
        factory="com.hm.vigil.platform.config.ClientConfigManager" 
        singleton="true" 
        closeMethod="closeClientConfigManager"/> --> 

     <ResourceLink name="platform/client/CONFIG_MANAGER" 
         global="platform/client/CONFIG_MANAGER" 
         type="com.hm.vigil.platform.config.ClientConfigManager"/>               

    <!-- Uncomment this to disable session persistence across Tomcat restarts --> 

    <Manager pathname="" /> 

    <!-- Uncomment this to enable Comet connection tacking (provides events 
     on session expiration as well as webapp lifecycle) --> 
    <!-- 
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" /> 
    --> 

</Context> 

感謝

+0

Tomcat中任何資源的名稱都以'java:comp'開頭。 – EJP

+0

是的,JNDI解析是initialContext.lookup(「java:comp/env」),然後是context.lookup(「zookeeperHost」) – Ironluca

回答

0

我將發表我的調查結果,以解決上述問題。

問題是,一個或多個資源對綁定到JNDI樹的另一資源具有內部引用。因此,在資源創建期間,其他資源嘗試解析公共資源的JNDI樹。現在,在上下文加載時,該上下文的JNDI樹實際上不存在,所以出現上述錯誤。

方法是在公共資源上聲明工廠方法,並從其他資源通過工廠方法獲取對公共資源的引用。

因此,作爲總體原則,我覺得,資源不能從JNDI解析其他資源。