120 votes

Que fait java:comp/env/ ?

Je viens de passer trop de temps à essayer de résoudre des erreurs lors de la connexion d'un bean d'usine JNDI. Le problème s'est avéré être qu'au lieu de ce...

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="java:comp/env/jdbc/loc"/>
</bean>

J'avais en fait écrit ceci...

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="jdbc/loc"/>
</bean>

J'en déduis que le java:comp/env/ fait peut-être référence à une variable d'environnement et fait en sorte qu'au final, c'est mon fichier de contexte qui est consulté. La seule différence est java:comp/env/ . De la bouche d'un expert, qu'est-ce que ça fait ?

Sans le java:comp/env/ dans la valeur, je recevais une erreur qui disait "Le nom jdbc n'est pas lié à ce contexte" .

3 votes

Lequel avez-vous utilisé au départ ? Votre question implique que vous utilisiez incorrectement le deuxième exemple ( jdbc/loc et donc java:comp/env/jdbc/loc est correcte), tandis que la réponse de cherouvim implique que vous utilisiez incorrectement le premier exemple ( java:comp/env/jdbc/loc et donc jdbc/loc est correcte). Quoi qu'il en soit, la vraie réponse est la suivante : cela dépend de l'identité de l'utilisateur. actuel le contexte.

1 votes

Celui qui n'a pas fonctionné était en effet dépourvu de java:comp/env/jdbc/loc, comme indiqué. Le fichier de contexte vers lequel on a pointé incluait la ressource "loc". Quelles sont les possibilités pour les contextes "actuels" ?

1 votes

J'ai répondu à cette question ici : stackoverflow.com/a/66325569/1051589 .

104voto

cherouvim Points 18550

Citation : https://web.archive.org/web/20140227201242/http://v1.dione.zcu.cz/java/docs/jndi-1.2/tutorial/beyond/misc/policy.html

Dans le contexte Root de l'espace de nom se trouve une liaison portant le nom "comp", qui est liée à un sous-arbre réservé pour les liaisons liées aux composants. Le site nom "comp" est l'abréviation de component. Il n'y a pas d'autres liaisons dans le contexte contexte Root. Cependant, le contexte Root est réservé pour la future expansion de la politique, en particulier pour nommer les ressources qui ne sont pas liées au composant lui-même mais à d'autres d'entités telles que des utilisateurs ou services. Par exemple, les futures politiques futures pourraient vous permettre de nommer les utilisateurs et les organisations/départements en utilisant noms tels que "java:user/alice" et "java:org/engineering". "java:org/engineering".

Dans le contexte "comp", il existe deux liaisons liaisons : "env" et "UserTransaction". Le nom "env" est lié à un sous-arbre qui est réservé aux liaisons du composant liées à l'environnement du composant, telles que définies par son descripteur de déploiement. "env" est l'abréviation de environment. Le site J2EE recommande (mais n'exige pas) la structure suivante pour l'espace de noms "env". espace de noms.

Ainsi, les liaisons que vous avez effectuées à partir de spring ou, par exemple, à partir d'un descripteur de contexte de tomcat vont par défaut sous java:comp/env/

Par exemple, si votre configuration est :

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="foo"/>
</bean>

Vous pouvez alors y accéder directement en utilisant :

Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/foo");

ou vous pourriez faire une étape intermédiaire pour ne pas avoir à spécifier "java:comp/env" pour chaque ressource que vous récupérez :

Context ctx = new InitialContext();
Context envCtx = (Context)ctx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("foo");

0 votes

Je pensais avoir bien compris, mais d'autres commentaires m'ont fait comprendre que je l'avais fait à l'envers. Si le descripteur de contexte de tomcat se trouve, par défaut, sous java:comp/env, cela ne signifie-t-il pas que je peux omettre le java:comp/env de la valeur ? Dans mon cas, j'ai dû l'ajouter pour que l'erreur "Name jdbc is not bound in this Context" disparaisse.

4 votes

Vous utilisez "foo" pour la liaison et "java:comp/env/foo" pour la recherche. Jetez un coup d'œil à blog.cherouvim.com/javax-sql-datasource-exposé-à-travers-jndi

3 votes

Le lien ci-dessus provient du tutoriel JNDI autonome, disponible à l'origine sur : docs.oracle.com/javase/jndi/tutorial/beyond/misc/policy.html .

37voto

Filip Spiridonov Points 1238

Il existe également une propriété resourceRef de JndiObjectFactoryBean c'est-à-dire, lorsqu'il est réglé sur true utilisé pour faire précéder automatiquement la chaîne de caractères java:comp/env/ s'il n'est pas déjà présent.

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="jdbc/loc"/>
  <property name="resourceRef" value="true"/>
</bean>

3voto

Après plusieurs tentatives et une recherche approfondie dans le code source de Tomcat, j'ai découvert que la simple propriété useNaming="false" a fait l'affaire ! Maintenant Tomcat résout les noms java:/liferay au lieu de java:comp/env/liferay

0 votes

Pourriez-vous fournir un exemple complet, y compris la définition de la ressource ? Je n'ai pas réussi à mettre en place ce système avec Tomcat 8.5. Un exemple plus complet m'aiderait peut-être à comprendre mon erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X