web-dev-qa-db-fra.com

Qu'est-ce que Java: comp / env / do?

Je viens de passer trop de temps de la journée à essayer de résoudre certaines erreurs lors de la connexion d’un bean factory JNDI. Le problème s'est avéré être qu'au lieu de cela ...

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

J'avais effectivement écrit ceci ...

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

J'en déduis que Java: comp/env/fait peut-être référence à une variable d'environnement et fait en sorte que, finalement, mon fichier de contexte soit examiné. La seule différence est Java: comp/env /. De la bouche d'un expert, qu'est-ce que cela fait?

Sans le préfixe Java: comp/env dans la valeur, j'obtiendrais une erreur disant "Le nom jdbc n'est pas lié dans ce contexte".

113
Danny

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

Au niveau de la racine de l'espace de noms, une liaison portant le nom "comp" est liée à un sous-arbre réservé aux liaisons liées aux composants. Le nom "comp" est l'abréviation de composant. Il n'y a pas d'autres liaisons au contexte racine. Toutefois, le contexte racine est réservé à l'extension future de la stratégie, en particulier à la désignation de ressources liées non pas au composant, mais à d'autres types d'entités, tels que des utilisateurs ou des services. Par exemple, les stratégies futures peuvent vous permettre de nommer des utilisateurs et des organisations/départements en utilisant des noms tels que "Java: utilisateur/alice" et "Java: org/engineering".

Dans le contexte "comp", il existe deux liaisons: "env" et "UserTransaction". Le nom "env" est lié à un sous-arbre réservé aux liaisons liées à l'environnement du composant, comme défini par son descripteur de déploiement. "env" est l'abréviation de environnement. J2EE recommande (sans toutefois exiger) la structure suivante pour l'espace de nom "env".

Ainsi, la liaison que vous avez faite depuis spring ou, par exemple, avec un descripteur de contexte Tomcat, passe 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>

Ensuite, vous pouvez y accéder directement en utilisant:

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

ou vous pouvez faire une étape intermédiaire pour ne pas avoir à spécifier "Java: comp/env" pour chaque ressource extraite:

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

Il existe également une propriété resourceRef sur JndiObjectFactoryBean qui, lorsqu'elle est définie sur true, est utilisée pour ajouter automatiquement la chaîne 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>
36
Filip Spiridonov

Après plusieurs tentatives et une analyse approfondie du code source de Tomcat, j'ai découvert que la simple propriété seNaming = "false" avait fait l'affaire! Maintenant, Tomcat résout les noms Java:/liferay au lieu de Java: comp/env/liferay

3