2010-11-04 10 views
101

Ho passato troppo tempo della mia giornata cercando di capire alcuni errori durante l'aggancio di alcuni bean factory JNDI. Il problema si è rivelato che invece di questo ...Cosa fa java: comp/env/do?

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

realtà avevo scritto questo ...

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

deduco che il java: comp/env/forse fa riferimento a qualche variabile d'ambiente e fa in modo che, in definitiva, venga esaminato il mio file di contesto. L'unica differenza è java: comp/env /. Dalla bocca di un esperto, che cosa fa?

Senza il prefisso java: comp/env nel valore, otterrei un errore che diceva "Nome jdbc non è associato in questo contesto".

+3

Quale hai usato inizialmente? La tua domanda implica che tu stavi usando erroneamente il secondo esempio ('jdbc/loc' e quindi' java: comp/env/jdbc/loc' è corretto), mentre la risposta di cherouvim implica che tu stavi usando in modo errato il primo esempio (' java: comp/env/jdbc/loc' e quindi 'jdbc/loc' è corretto). Indipendentemente da ciò, la vera risposta è: dipende dal ** corrente ** contesto. – BalusC

+1

Quello che non funzionava mancava davvero java: comp/env/jdbc/loc, come implicito. Il file di contesto indicato includeva la risorsa "loc". Quali sono le possibilità per i contesti "attuali"? – Danny

risposta

90

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

il contesto radice dello spazio dei nomi è un legame con il nome "comp", che è destinato a una sottostruttura riservata per associazione ai componenti correlati. Il nome "comp" è l'abbreviazione di componente. Non ci sono altri collegamenti nel contesto radice . Tuttavia, la radice contesto è riservato per il futuro espansione della politica, in particolare per la denominazione delle risorse che sono legati non al componente stesso, ma ad altri tipi di entità quali utenti o reparti. Ad esempio, le future politiche potrebbero consentire all'utente di nominare gli utenti e organizzazioni/dipartimenti utilizzando i nomi come "java: user/alice" e "java: org/engineering".

Nel contesto "comp", ci sono due associazioni : "env" e "UserTransaction". Il nome "env" è associato a un sottostruttura che è riservato per i collegamenti relativi all'ambiente del componente, come definito dal relativo descrittore di distribuzione. "env" è l'abbreviazione di environment. Il J2EE consiglia (ma non richiede) la seguente struttura per lo spazio dei nomi "env" .

Così il legame che hai fatto dalla primavera o, per esempio, da un contesto descrittore gatto va per default in java: comp/env/

Ad esempio, se la configurazione è:

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

quindi è possibile accedervi direttamente tramite:

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

o si potrebbe fare un passo intermedio in modo da non è necessario specificare "j Ava: comp/env" per ogni risorsa si recupera:

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

Pensavo di aver capito bene, ma ulteriori commenti mi hanno fatto capire che l'avevo fatto all'indietro. Se il descrittore di contesto di tomcat è andato, di default, sotto java: comp/env, non significherebbe che posso omettere java: comp/env dal valore? Nel mio caso, ho dovuto aggiungerlo per fare in modo che l'errore "Nome jdbc non fosse legato in questo contesto" andasse via. – Danny

+4

Ti leghi usando "pippo" e cerca usando "java: comp/env/foo". Dai un'occhiata a http://blog.cherouvim.com/javax-sql-datasource-exposed-thn-jndi/ – cherouvim

+3

Il link precedente è tratto dal tutorial JNDI standalone, originariamente disponibile su: http://docs.oracle.com /javase/jndi/tutorial/beyond/misc/policy.html. –

33

C'è anche una proprietà resourceRef di JndiObjectFactoryBean che è, se impostato su true, utilizzata per anteporre automaticamente la stringa java:comp/env/ se non è già presente.

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

Grazie, funziona davvero con Tomcat e Glassfish. –

+0

Funziona anche con Tomcat e Jetty. – txedo

1

Dopo vari tentativi e andare in profondità nel codice sorgente di Tomcat ho scoperto che la semplice proprietà useNaming="false" ha fatto il trucco !! Ora Tomcat risolve i nomi java:/Liferay invece di java: comp/env/Liferay