2016-03-24 20 views
1

JNDI tarafından sağlanan ve platformdan bağımsız olması gereken bir özellik dosyasına yüklenmeye çalışıyorum. Weblogic İçinSpring & JNDI: kaynak platformunu bağımsız olarak bulun

: Tomcat için

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

: Ben şu şekillerde yapabiliriz platformda bağımlı biliyorum

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

çekirdek sorundur o Tomcatjava:comp/env/ önekine ihtiyaç vardır. Spring tüm bu platformu bağımsız olarak yükleyebildiğinden, Spring benim JNDI kaynaklarımı yükleme imkanlarını incelemeye çalıştım.

I şu şekilde Spring JndiTemplate kullanabilir tespit:

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

Bu tomcat arama sırasında bir ön ek olarak java:comp/env kullanmaya gerek bağımlı ancak hala bir platformdur.

Jndi adları veya "java: comp/env /" içeremez olabilir: J2EE uygulamaları tarafından beklenen önek erişirken StackOverflow ve Spring javadocs daha baktığımda, aşağıdaki sahiptir sınıfı JndiLocatorSupport, bulunan yerel olarak eşlenmiş (ENC - Çevresel Adlandırma Bağlamı) kaynağı. Değilse, "resourceRef" özelliği true (varsayılan değer false) ise "java: comp/env /" önekine eklenir ve başka bir şema (ör. "Java:") verilir.

Yani, JndiLocatorSupport uzanan JndiObjectFactoryBean oluşturulan setResourceRef etkin ama önek görünmüyor.

Çekirdek sorun:
Aşağıdaki kodu kullanarak:

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

Ben aynı etkiye sahip beklersiniz:

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

Ama öyle değil. Hiç bir etkisi yok gibi görünüyor. Fakat kaynak koduna bakarsak, şöyle olur: JndiObjectFactoryBean.lookup() ->JndiObjectLocator.lookup() ->JndiLocatorSupport.lookup(), does call doğru yöntemler.

cevap

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

ve

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

arama konusunda aynı mı. Birincisi, JndiTemplate'u elde etmenin sadece çok karmaşık bir yoludur. Yaptığınız tüm ayarlar JndiTemplate iç için JndiObjectFactoryBean DEĞİLDİR. Temel olarak tüm yaklaşımınız hiçbir şey eklemez.

Bunun yerine, bir JndiLocatorDelegate kullanın ve bunu aramasına izin verin (JndiTemplate'u almaya çalışmayın!).

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

varsayılan olarak bu irade java:comp/env bir arama yapmak ve bulunmazsa eğer (sen geçirilen sey) düz propertiesLocation bir yedeği yok.

İlgili konular