Cosa fa java: comp / env /?


116

Ho passato troppo tempo della mia giornata cercando di capire alcuni errori durante il collegamento di alcuni factory bean JNDI. Il problema si è scoperto che invece di questo ...

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

In realtà avevo scritto questo ...

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

Ne deduco che java:comp/env/forse fa riferimento a qualche variabile di 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, cosa fa?

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


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

1
Quello che non ha funzionato mancava davvero java: comp / env / jdbc / loc, come implicito. Il file di contesto a cui si puntava includeva la risorsa "loc". Quali sono le possibilità per i contesti "attuali"?
Danny

Risposte:


100

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

Nel contesto radice dello spazio dei nomi c'è un'associazione con il nome "comp", che è associata a una sottostruttura riservata alle associazioni relative ai componenti. Il nome "comp" è l'abbreviazione di component. Non ci sono altre associazioni nel contesto radice. Tuttavia, il contesto root è riservato per la futura espansione della policy, in particolare per la denominazione di risorse che sono legate non al componente stesso ma ad altri tipi di entità come utenti o reparti. Ad esempio, le politiche future potrebbero consentire di nominare utenti e organizzazioni / reparti utilizzando nomi come "java: user / alice" e "java: org / engineering".

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

Quindi l'associazione che hai fatto dalla primavera o, ad esempio, da un descrittore di contesto tomcat va di default sotto java: comp / env /

Ad esempio, se la tua configurazione è:

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

Quindi puoi accedervi direttamente utilizzando:

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

oppure potresti fare un passaggio intermedio in modo da non dover specificare "java: comp / env" per ogni risorsa che recuperi:

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

Pensavo di aver capito bene, ma ulteriori commenti mi hanno fatto capire di averlo fatto al contrario. Se il descrittore di contesto tomcat andasse, per impostazione predefinita, in java: comp / env, non significherebbe che posso omettere java: comp / env dal valore? Nel mio caso, ho dovuto aggiungerlo per far scomparire l'errore "Nome jdbc non associato in questo contesto".
Danny

4
Puoi eseguire il binding usando "foo" e cercare usando "java: comp / env / foo". Dai
cherouvim

3
Il collegamento sopra è tratto dal tutorial JNDI autonomo, originariamente disponibile su: docs.oracle.com/javase/jndi/tutorial/beyond/misc/policy.html .
Danilo Piazzalunga

cosa succede se ci sono più / -es nella tua ricerca? Come: "java: com / env / foo / bar", il tuo valore jndiName è "foo / bar" o "foo.bar"?
Pieter De Bie

Il valore jndiName corretto sarebbe "foo / bar" @PieterDeBrie.
tftdias

37

C'è anche una proprietà resourceRefdi JndiObjectFactoryBeanche, 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>

3

Dopo diversi tentativi e approfondendo il codice sorgente di Tomcat ho scoperto che la semplice proprietà useNaming = "false" ha funzionato !! Ora Tomcat risolve i nomi java: / liferay invece di java: comp / env / liferay


Potreste fornire un esempio completo, inclusa la definizione della risorsa? Non sono riuscito a configurarlo con successo con Tomcat 8.5: un esempio più completo mi avrebbe aiutato a vedere il mio errore, forse.
RobertG
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.