2016-03-24 9 views
1

Ich versuche, in einer Eigenschaft-Datei von JNDI zur Verfügung gestellt, die plattformunabhängig sein sollte. Ich weiß, dass ich es auf folgende Weise tun kann, abhängig von der Plattform:Spring & JNDI: Finden Sie Ressource unabhängig Plattform

für WebLogic:

Properties properties = new Properties(); 
properties.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); 
InitialContext context = new InitialContext(properties); 
context.lookup(propertiesLocation); 

Für Tomcat:

Context context = new InitialContext(); 
Context envCtx = (Context) context.lookup("java:comp/env"); 
final Object lookup = envCtx.lookup(propertiesLocation); 

Das Kernproblem besteht darin, dass in Tomcat wird das Präfix java:comp/env/ benötigt. Da Spring in der Lage ist, alle diese Plattform unabhängig zu laden, habe ich versucht, die Möglichkeiten von Spring meine JNDI Ressourcen zu laden.

fand ich heraus, dass ich die JndiTemplate des Frühlings in der folgenden Art und Weise verwendet werden: während der Look-up auf tomcat

JndiTemplate jndiTemplate = new JndiTemplate(); 
Object lookup = jndiTemplate.lookup(propertiesLocation); 

Dies ist immer noch plattformabhängig jedoch benötigen java:comp/env als Präfix zu verwenden. Suchen Sie weiter auf StackOverflow und in den Spring javadocs, fand ich die Klasse JndiLocatorSupport, die folgendes hat:

JNDI Namen enthalten kann oder auch nicht die „java: comp/env /“ Präfix von J2EE-Anwendungen erwartet beim Zugriff auf eine lokal zugeordnete Ressource (ENC - Environmental Naming Context). Ist dies nicht der Fall, wird das Präfix "java: comp/env /" vorangestellt, wenn die Eigenschaft "resourceRef" wahr ist (der Standardwert ist false) und kein anderes Schema (z. B. "java:") angegeben wird.

So habe ich eine JndiObjectFactoryBean die JndiLocatorSupport erstreckt, aktiviert setResourceRef aber es scheint nicht das Präfix anhängen.

Kernproblem:
Wenn mit dem folgenden Code:

JndiObjectFactoryBean factoryBean = new JndiObjectFactoryBean(); 
factoryBean.setResourceRef(true); 
Object lookup = factoryBean.getJndiTemplate().lookup(propertiesLocation); 

Ich würde erwarten, dass es die gleiche Wirkung hat wie:

JndiObjectFactoryBean factoryBean = new JndiObjectFactoryBean(); 
Object lookup = factoryBean.getJndiTemplate().lookup("java:comp/env/" + propertiesLocation); 

Aber es funktioniert nicht. Es scheint überhaupt keine Wirkung zu haben. Aber wenn ich durch den Quellcode schaue, geht es so: JndiObjectFactoryBean.lookup() ->JndiObjectLocator.lookup() ->JndiLocatorSupport.lookup(), welche does call die richtigen Methoden.

Antwort

3
JndiObjectFactoryBean factoryBean = new JndiObjectFactoryBean(); 
factoryBean.setResourceRef(true); 
Object lookup = factoryBean.getJndiTemplate().lookup(propertiesLocation); 

und

JndiTemplate jndiTemplate = new JndiTemplate(); 
Object lookup = jndiTemplate.lookup(propertiesLocation); 

Sind das gleiche in Bezug auf den Nachschlag. Die erste ist nur eine sehr komplexe Möglichkeit, eine JndiTemplate zu erhalten. Alle Einstellungen, die Sie vornehmen, sind für den JndiObjectFactoryBean NICHT für den internen JndiTemplate. Grundsätzlich fügt Ihr gesamter Ansatz nichts hinzu.

Verwenden Sie stattdessen eine JndiLocatorDelegate und lassen Sie die Suche (versuchen Sie nicht, die JndiTemplate zu bekommen!).

JndiLocatorDelegate jndi = JndiLocatorDelegate.createDefaultResourceRefLocator(); 
Object lookup = jndi.lookup(propertiesLocation); 

Dies wird standardmäßig tun eine Suche in java:comp/env und wenn nicht ein Rückfall auf eine Ebene propertiesLocation gefunden (was Sie bestanden in).