2010-11-04 15 views
101

Je viens de passer trop de temps de ma journée à essayer de comprendre quelques erreurs lors de l'accrochage d'un bean factory JNDI. Le problème est avéré qu'au lieu de cette ...Qu'est-ce que java: comp/env/do?

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

j'avais écrit ce fait ...

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

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

Sans le préfixe java: comp/env dans la valeur, j'obtiendrais une erreur indiquant que "Name jdbc n'est pas lié dans ce contexte".

+3

Lequel avez-vous initialement utilisé? Votre question implique que vous utilisiez incorrectement le second exemple ('jdbc/loc' et donc' java: comp/env/jdbc/loc' est correct), alors que la réponse de cherouvim implique que vous utilisiez incorrectement le premier exemple (' java: comp/env/jdbc/loc' et donc 'jdbc/loc' est correct). Quoi qu'il en soit, la vraie réponse est: cela dépend du contexte ** actuel **. – BalusC

+1

Celui qui ne fonctionnait pas manquait en effet java: comp/env/jdbc/loc, comme implicite. Le fichier de contexte qui a été pointé à inclus la ressource "loc". Quelles sont les possibilités pour les contextes «actuels»? – Danny

Répondre

90

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

le contexte racine de l'espace de noms est une reliure avec le nom « comp », qui est lié à une sous-arborescence réservée pour les liaisons liées à composants. Le nom "comp" est l'abréviation de component. Il n'existe aucune autre liaison au contexte racine . Cependant, la racine contexte est réservé pour l'expansion future de la politique, en particulier pour nommer des ressources qui ne sont pas liés au composant lui-même, mais à d'autres types d'entités telles que les utilisateurs ou départements. Par exemple, les futures stratégies peuvent vous permettre de nommer les utilisateurs et les organisations/services en utilisant les noms tels que "java: user/alice" et "java: org/engineering".

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

Ainsi la liaison que vous avez fait à partir du printemps ou, par exemple, à partir d'un descripteur de contexte tomcat aller 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 à l'aide:

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

ou vous pouvez faire une étape intermédiaire de sorte que vous ne devez pas spécifier « j ava: 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

Je pensais avoir compris cela correctement, mais d'autres commentaires m'ont fait réaliser que j'avais fait en arrière. Si le descripteur de contexte tomcat est passé, par défaut, sous java: comp/env, cela ne veut-il pas dire que je peux omettre le java: comp/env de la valeur? Dans mon cas, j'ai dû l'ajouter pour faire disparaître l'erreur "Nom jdbc n'est pas lié dans ce contexte". – Danny

+4

Vous liez en utilisant "foo" et recherchez en utilisant "java: comp/env/foo". Jetez un oeil à http://blog.cherouvim.com/javax-sql-datasource-exposed-through-jndi/ – cherouvim

+3

Le lien ci-dessus est tiré du didacticiel JNDI autonome, disponible à l'origine sur: http://docs.oracle.com /javase/jndi/tutorial/beyond/misc/policy.html. –

33

Il y a également une propriété resourceRef de JndiObjectFactoryBean qui, lorsqu'il est réglé sur true, utilisé pour préfixer automatiquement la chaîne java:comp/env/ si elle 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> 
+0

Merci, cela fonctionne vraiment avec Tomcat et Glassfish. –

+0

Il fonctionne également avec Tomcat et Jetty. – txedo

1

Après plusieurs tentatives et aller en profondeur dans le code source de Tomcat Je trouve que la propriété simple useNaming="false" a fait l'affaire !! Maintenant, Tomcat résout les noms java:/liferay au lieu de java: comp/env/liferay