À quoi sert resource-ref dans web.xml?

112

Je me demande simplement quand / pourquoi définiriez-vous un <resource-ref>élément dans votre web.xmlfichier?

J'aurais pensé qu'il serait défini dans votre serveur Web / App en utilisant JNDI et ensuite rechercher la référence JNDI dans votre code Java?

La définition de ressource-ref me semble un peu redondante et je ne peux pas penser à quand elle pourrait être utile. Exemple:

<resource-ref>
  <description>Primary database</description>
  <res-ref-name>jdbc/primaryDB</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>CONTAINER</res-auth>
</resource-ref>
JMM
la source

Réponses:

156

Vous pouvez toujours faire référence aux ressources de votre application directement par leur nom JNDI tel que configuré dans le conteneur, mais si vous le faites, vous câblez essentiellement le nom spécifique au conteneur dans votre code. Cela présente certains inconvénients, par exemple, si vous souhaitez changer le nom plus tard pour une raison quelconque, vous devrez mettre à jour toutes les références dans toutes vos applications, puis les reconstruire et les redéployer.

<resource-ref>introduit une autre couche d'indirection: vous spécifiez le nom que vous souhaitez utiliser dans le fichier web.xml et, en fonction du conteneur, vous fournissez une liaison dans un fichier de configuration spécifique au conteneur .

Alors, voici ce qui se passe : disons que vous voulez rechercher le java:comp/env/jdbc/primaryDBnom. Le conteneur trouve que web.xml a un <resource-ref>élément pour jdbc/primaryDB, donc il examinera la configuration spécifique au conteneur, qui contient quelque chose de similaire à ce qui suit:

<resource-ref>
  <res-ref-name>jdbc/primaryDB</res-ref-name>
  <jndi-name>jdbc/PrimaryDBInTheContainer</jndi-name>
</resource-ref>

Enfin, il renvoie l'objet enregistré sous le nom de jdbc/PrimaryDBInTheContainer.

L'idée est que la spécification des ressources dans le fichier web.xml a l'avantage de séparer le rôle de développeur du rôle de déployeur . En d'autres termes, en tant que développeur, vous n'avez pas besoin de savoir comment vos ressources requises sont réellement appelées en production, et en tant que responsable du déploiement de l'application, vous aurez une belle liste de noms à mapper sur de vraies ressources.

Candiru
la source
6
À mon humble avis, cela va au-delà de la séparation des rôles. L'idée est que vous ne pouvez pas supposer qu'un nom jndi est disponible sur un serveur, vous avez donc besoin d'un moyen de mapper le nom utilisé dans votre application sur le nom JNDI "réel" choisi par le déployeur.
Pascal Thivent
3
Cela doit être élémentaire, puisque je ne peux pas le trouver avec Google, mais si je veux rechercher "java: comp / env / jdbc / primaryDB", alors pourquoi le res-ref-name est "jdbc / primaryDB"?
Torben
4
Pour ce que je sais, l'élément "jndi-name" ne fait PAS partie de web.xml standard, mais plutôt de descripteurs de déploiement de fournisseurs spécifiques.
Ramon Chiara
2
@RaviParekh, il a mentionné "configuration spécifique au conteneur", il peut s'agir de jboss-web.xml ou weblogic.xml ou de tout autre fichier descripteur de déploiement spécifique au fournisseur
abhihello123
1
Pouvons-nous relier cela à Tomcat? Je veux dire la source de données définie dans context.xml dans tomcat et resource-ref dans web.xml
Atul