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.