2017-01-24 1 views
1

J'essaie de configurer un serveur exécutant Tomcat 8 pour que les ressources d'URL JNDI soient disponibles pour un grand nombre d'applications exécutées sur ce serveur. Les applications sont simples jsp/servlet avec Maven (No Spring).Comment utiliser les ressources d'URL JNDI globales dans Tomcat 8?

J'ai deux exemples de ressources globales que j'essaie d'utiliser, l'une est une DataSource qui fonctionne correctement et l'autre qui ne l'est pas.

DataSource

En Tomcats context.xml dans l'élément GlobalNamingResources

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

En Tomcats web.xml, élément haut niveau

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

Que ce soit pour le DataSource, et cela fonctionne

Pour la ressource URL, j'ai cela dans le server.xml

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

Mon usine d'objet a été créé la même manière que dans cette réponse: Tomcat: use FTP connection via JNDI Sauf que j'ajouté quelques instructions println pour prouver que la langue était utilisé et avait l'URL correcte, ce qu'il fait.

Je donne les résultats suivants 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> 

Enfin, le code qui accède à ce sujet. Ce code est le résultat de la décompilation d'un pot, ce n'est pas un pot de tiers mais je n'ai pas le code source. L'exception se produit dans la ligne jndiReference = ic.lookup(serviceName);. serviceName est le nom de la ressource et jndiRoot est toujours null (Le code qui appelle cette méthode passe en null). La méthode getInitialContext() crée simplement une nouvelle instance de javax.naming.InitialContext si aucune n'a déjà été créée.

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

La ligne des fichier de propriétés que les cartes à la ressource propertyserviceurl=url/LOGIN_MODULE_CONFIGURATION_SERVICE

J'ai aussi essayé d'ajouter un ResourceLink à Tomcats context.xml. J'ai essayé de rendre le nom de ResourceLink unique et la valeur de global identique à la ressource actuelle. J'ai également essayé de modifier le fichier de propriétés pour le mapper au nom ResourceLink au lieu de la ressource, mais j'ai toujours les mêmes résultats.

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

L'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) 

J'ai passé quelques jours sur celui-ci et ai du mal à comprendre ce que la configuration que je dois obtenir ce travail. Je pense que le plus gros obstacle est que je ne peux pas changer le code Java qui essaie d'accéder à la ressource.

Répondre

0

Je l'ai eu pour travailler. Je ne comprends pas vraiment comment fonctionne ResourceLink puisque son nom n'est référencé nulle part. Mais si quelque chose est différent, cela ne fonctionnera pas. Fondamentalement, je devais ajouter java:/comp/env/ au début du nom de la ressource, car je ne peux pas mettre à jour le code qui appelle cela.

Mise à jour de la ressource dans le serveur Tomcats.xml à

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

Mis à jour le ResourceLink dans Tomcats context.xml à

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

Mise à jour des propriétés d'entrée fichier à

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