Recevez les mises à jour gratuites du blog par Email : »» Garanti sans spam indésirable ««

Utilisation du contexte JNDI de Tomcat via Spring

de Mimie le 26 janvier 2010

Rubrique : Programmation

Présentation

Si votre application web a besoin de manipuler des données provenant d’une base de données, et que vous devez vous y connecter depuis le contexte JNDI de votre serveur d’applications, il existe plusieurs chemins qui permettent d’y arriver, je vais vous en présenter deux dans cet article.

Environnement technique

  1. Spring framework est utilisé pour la définition de vos services métiers et de vos beans d’accès aux données (v2.08)
  2. Vous utilisez Apache Tomcat comme serveur d’applications opensource (v6.0.14)
  3. Votre environnement de travail est Eclipse (v3.4.0)

Problème à résoudre

  1. Fichier de configuration Spring pour l’utilisation d’une variable JNDI lié à Tomcat (jdbc/dbUser)
  2. <!DOCTYPE beans SYSTEM "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
    	<!-- ###### SERVICES ###### -->
    	<bean id="userService" class="fr.geeks.business.UserServiceImpl" init-method="init">
    		<property name="userDao" ref="userDao" />
    	</bean>
    	<!-- ###### JNDI Lookup ###### -->
    	<bean id="dbUser" class="org.springframework.jndi.JndiObjectFactoryBean" lazy-init="true">
    		<property name="jndiName" value="java:comp/env/jdbc/dbUser" />
    	</bean>
    	<!-- ###### DAOs ###### -->
    	<bean id="userDao" class="fr.geeks.domain.UserDaoImpl">
    		<property name="dataSource" ref="dbUser" />
    	</bean>
    </beans>
    
  3. Erreur à résoudre au démarrage de votre application
  4. Caused by: javax.naming.NameNotFoundException: Le Nom jdbc n'est pas lié à ce Contexte
    	at org.apache.naming.NamingContext.lookup(NamingContext.java:770)
    

Solution 1

Cette solution est largement utilisée : il faut déclarer votre source de données au niveau de Tomcat (conf/server.xml) et de lier cette ressource au contexte de votre application web, tout ce paramétrage se fait au niveau de votre serveur d’applications :

<GlobalNamingResources>
   <Resource name="jdbc/dbUser" auth="Container" type="javax.sql.DataSource" username="xxx" password="yyy" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/des_geeks?autoReconnect=true"/>
</GlobalNamingResources>
<Context docBase="TomcatDatasourceJndi" path="/TomcatDatasourceJndi" reloadable="true" source="org.eclipse.jst.jee.server:TomcatDatasourceJndi">
      	<ResourceLink global="jdbc/dbUser" name="jdbc/dbUser" type="javax.sql.DataSource"/>
      </Context>

Solution 2

Cette solution est encore plus rapide et permet de ne rien toucher à votre serveur, tout se fait du côté de votre application web : déposer un fichier META-INF/context.xml contenant le paramétrage de la source de données à utiliser et son nom JNDI par lequel elle est appelée :

<?xml version="1.0" encoding="UTF-8"?>
<Context>
	<!-- Specify a JDBC datasource -->
	<Resource name="jdbc/dbUser" auth="Container" type="javax.sql.DataSource"
		username="xxx" password="yyy" driverClassName="com.mysql.jdbc.Driver"
		url="jdbc:mysql://localhost:3306/des_geeks?autoReconnect=true"
		validationQuery="select 1" maxActive="10" maxIdle="4" />
</Context>

Conclusion

Je suis personnellement convaincu par le seconde solution qui me semble plus simple à mettre en place et permet d’avoir une configuration propre par application. Cependant la première fonctionne mais il faut prendre un peu plus de précaution car mettre les mains dans la configuration de votre Tomcat peut s’avérer fatal :)

sources disponibles ici

Cet article a été écrit par :

– qui a déjà rédigé 123 posts sur Des Geeks et des lettres.

Passionné d'informatique et développeur JavaEE de métier, je me consacre principalement à écrire des billets sur les sujets du Web et de la programmation Web. Ce blog est un espace qui me permet de partager mes découvertes avec vous et me sert accessoirement de pense bête !

Contacter l'auteur

Jetez aussi un oeil sur :

{ 5 commentaires… à vous de vous exprimer ! }

1 Greg janvier 26, 2010 à 20 h 53 min

Et vu ce que tu fais de tes petites mimines, je confirme : ça marche !

Répondre

2 Mimie janvier 29, 2010 à 12 h 51 min

Merci Greg :-)

Répondre

3 Cyspeo mars 14, 2011 à 11 h 32 min

Il y a un avantage avec la seconde solution :
On peu avoir besoin de déployer l’application sur plusieurs serveur (dev, test, prod) dans ce cas u paramétrage au niveau du serveur évite de faire plusieurs war différents

Répondre

4 Cyspeo mars 14, 2011 à 11 h 33 min

Par don je voulais parler de la première solution !!

Répondre

5 Mimie mars 14, 2011 à 12 h 46 min

Oui tu as raison, la première solution a bien des avantages, d’ailleurs en ce moment je suis revenu à la solution 1 pour ne pas que des infos propres à ma base soit contenu dans mon projet de présentation.

Mais au lieu de linker la ressource à mon projet dans tomcat je la lie dans mon projet au niveau du context.xml :

<?xml version="1.0" encoding="UTF-8"?>
<Context>
	<!-- Specify a JDBC datasource -->
	<ResourceLink name="jdbc/dbUser" global="jdbc/dbUser" type="javax.sql.DataSource"/>
</Context>

Répondre

Laissez un Commentaire

Article précédent:

Article suivant: