2017-01-24 1 views
1

Ich versuche, einen Server einzurichten, auf dem Tomcat 8 ausgeführt wird, um JNDI-URL-Ressourcen für eine große Anzahl von Anwendungen verfügbar zu machen, die auf diesem Server ausgeführt werden. Die Apps sind einfach jsp/servlet mit Maven (No Spring).Wie verwenden Sie globale JNDI-URL-Ressourcen in Tomcat 8?

Ich habe 2 Beispiele für globale Ressourcen, die ich versuche zu verwenden, eine ist eine DataSource, die korrekt funktioniert und eine ist die URL, die nicht funktioniert.

Datasource

In Tomcats context.xml innerhalb des GlobalNamingResources Element

<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" /> 

In Tomcats web.xml, Top-Level-Element

<resource-ref> 
    <res-ref-name>APPNAME</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
    <res-sharing-scope>Unshareable</res-sharing-scope> 
</resource-ref> 

dass es für die Datasource ist, und es funktioniert

Für die URL-Ressource, ich habe dies in den server.xml

<Resource name="url/LOGIN_MODULE_CONFIGURATION_SERVICE" auth="Container" 
    type="java.net.URL" factory="com.mycompany.objectfactory.JndiUrlObjectFactory" 
    url="AValidUrl" /> 

Mein Objekt Fabrik auf die gleiche Weise, wie in dieser Antwort erstellt wurde: Tomcat: use FTP connection via JNDI Außer, dass ich ein paar println Aussagen hinzugefügt zu beweisen, dass es wurde verwendet und hatte die richtige URL, die es tut.

Ich habe folgendes Tomcats web.xml

<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> 

Schließlich wird der Code, der diese zugreift. Dieser Code ist das Ergebnis der Dekompilierung eines Jars, es ist kein Drittanbieter-JAR, aber ich habe keinen Quellcode. Die Ausnahme tritt in der jndiReference = ic.lookup(serviceName); Zeile auf. serviceName ist der Name der Ressource und jndiRoot ist immer Null (Der Code, der diese Methode aufruft, wird als Null übergeben). Die Methode getInitialContext() erstellt nur eine neue Instanz von javax.naming.InitialContext, falls noch keine erstellt wurde.

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; 
} 

Die Linie von den Eigenschaften-Datei, die Karten auf die Ressource propertyserviceurl=url/LOGIN_MODULE_CONFIGURATION_SERVICE

Ich habe auch versucht, ein Resource zu Tomcats context.xml hinzufügen. Ich habe versucht, den Namen des ResourceLink eindeutig zu machen und den Wert von global den gleichen wie die tatsächliche Ressource. Habe auch versucht, die Eigenschaftsdatei so zu ändern, dass sie dem ResourceLink-Namen statt der Ressource zugeordnet wird, aber ich bekomme immer die gleichen Ergebnisse.

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

Die Exception

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) 

Ich habe ein paar Tage auf diesem verbracht und Mühe habe, herauszufinden, was Konfiguration ich diese bekommen müssen, um zu arbeiten. Ich denke, die größte Hürde ist, dass ich den Java-Code nicht ändern kann, der versucht, auf die Ressource zuzugreifen.

Antwort

0

Ich habe es zur Arbeit gebracht. Ich verstehe nicht wirklich, wie der ResourceLink funktioniert, da sein Name nirgends referenziert wird. Aber wenn etwas anders ist, wird es nicht funktionieren. Grundsätzlich musste ich java:/comp/env/ an den Anfang des Ressourcennamens hinzufügen, da ich den Code, der dies aufruft, nicht aktualisieren kann.

Die Ressource in Tomcats Server aktualisiert.xml

<Resource name="java:/comp/env/url/LOGIN_MODULE_CONFIGURATION_SERVICE" auth="Container" 
    type="java.net.URL" factory="com.mycompany.objectfactory.JndiUrlObjectFactory" 
    url="AValidUrl" /> 

die Resource in Tomcats context.xml zu

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

die Eigenschaften Eintrag

propertyserviceurl=java:/comp/env/url/LOGIN_MODULE_CONFIGURATION_SERVICE 
zu

Datei aktualisiert Aktualisiert