2015-04-26 164 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解析其他资源。