Java 如何在Tomcat8中使用全局JNDI URL资源?

Java 如何在Tomcat8中使用全局JNDI URL资源?,java,xml,tomcat8.5,Java,Xml,Tomcat8.5,我正在尝试设置一个运行Tomcat8的服务器,使该服务器上运行的大量应用程序都可以使用JNDI URL资源。这些应用程序是带有Maven(无Spring)的普通jsp/servlet 我有两个我试图使用的全局资源的例子,一个是工作正常的数据源,另一个是不正常的URL 数据源 在GlobalNamingResources元素内的Tomcats context.xml中 <Resource name="APPNAME" auth="Container" type="javax.sql.Data

我正在尝试设置一个运行Tomcat8的服务器,使该服务器上运行的大量应用程序都可以使用JNDI URL资源。这些应用程序是带有Maven(无Spring)的普通jsp/servlet

我有两个我试图使用的全局资源的例子,一个是工作正常的数据源,另一个是不正常的URL

数据源

在GlobalNamingResources元素内的Tomcats context.xml中

<Resource name="APPNAME" auth="Container" type="javax.sql.DataSource"
   maxTotal="100" maxIdle="30" maxWaitMillis="10000" username="appuser"
   password="password" driverClassName="oracle.jdbc.driver.OracleDriver"
   url="aUrl" />
属性文件中映射到资源
propertyserviceurl=url/LOGIN\u模块\u配置\u服务的行

我还尝试将ResourceLink添加到Tomcats context.xml。我已尝试使ResourceLink的名称唯一,并使global的值与实际资源的值相同。还尝试修改属性文件以映射到ResourceLink名称而不是资源,但我总是得到相同的结果

<ResourceLink name="url/LOGIN_MODULE_CONFIGURATION_SERVICE" 
    global="url/LOGIN_MODULE_CONFIGURATION_SERVICE" type="java.net.URL" />

我花了几天的时间在这个问题上,我很难弄清楚我需要什么样的配置才能让它工作。我认为最大的障碍是我无法更改尝试访问资源的java代码。

我让它工作了。我真的不明白ResourceLink是如何工作的,因为它的名称在任何地方都没有被引用。但如果有什么不同的话,那就行不通了。基本上,我需要在资源名称的开头添加
java:/comp/env/
,因为我无法更新调用该名称的代码

将Tomcats server.xml中的资源更新为

<Resource name="java:/comp/env/url/LOGIN_MODULE_CONFIGURATION_SERVICE" auth="Container"
    type="java.net.URL" factory="com.mycompany.objectfactory.JndiUrlObjectFactory"
    url="AValidUrl" />
<resource-ref>
   <res-ref-name>url/LOGIN_MODULE_CONFIGURATION_SERVICE</res-ref-name>
   <res-type>java.net.URL</res-type>
   <res-auth>Container</res-auth>
</resource-ref>
public static URL getUrl(final String serviceName, final String jndiRoot) {
    URL result = null;
    if (!isEmpty((Object) serviceName)) {
        final InitialContext ic = getInitialContext();
        Object jndiReference = null;
        try {
            jndiReference = ic.lookup(serviceName);
        } catch (NamingException ex) {
            ex.printStackTrace();
            if (!isEmpty((Object) jndiRoot)) {
                final String name = String.valueOf(jndiRoot) + serviceName;
                try {
                    jndiReference = ic.lookup(name);
                } catch (NamingException ex2) {
                    ex.printStackTrace();
                }
            }
        }
        if (jndiReference instanceof URL) {
            result = (URL) jndiReference;
        } else if (jndiReference instanceof Reference) {
            final Reference reference = (Reference) jndiReference;
            final RefAddr refAddr = reference.get("spec");
            try {
                result = new URL(getString(refAddr.getContent()));
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }
    }
    return result;
}
<ResourceLink name="url/LOGIN_MODULE_CONFIGURATION_SERVICE" 
    global="url/LOGIN_MODULE_CONFIGURATION_SERVICE" type="java.net.URL" />
javax.naming.NameNotFoundException: Name [url/LOGIN_MODULE_CONFIGURATION_SERVICE] is not bound in this Context. Unable to find [url].
at org.apache.naming.NamingContext.lookup(NamingContext.java:816)
at org.apache.naming.NamingContext.lookup(NamingContext.java:173)
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:163)
at javax.naming.InitialContext.lookup(InitialContext.java:417)
at com.mycompany.common.supplement.web.WebHelper.getUrl(WebHelper.java:739)
<Resource name="java:/comp/env/url/LOGIN_MODULE_CONFIGURATION_SERVICE" auth="Container"
    type="java.net.URL" factory="com.mycompany.objectfactory.JndiUrlObjectFactory"
    url="AValidUrl" />
<ResourceLink name="url/LOGIN_MODULE_CONFIGURATION_SERVICE" 
    global="java:/comp/env/url/LOGIN_MODULE_CONFIGURATION_SERVICE" type="java.net.URL" />
propertyserviceurl=java:/comp/env/url/LOGIN_MODULE_CONFIGURATION_SERVICE