我试图加载JNDI提供的属性文件,该文件应该是独立于平台的。我知道我可以通过以下方式实现,具体取决于平台:
对于Weblogic:
Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
InitialContext context = new InitialContext(properties);
context.lookup(propertiesLocation);
对于Tomcat:
Context context = new InitialContext();
Context envCtx = (Context) context.lookup("java:comp/env");
final Object lookup = envCtx.lookup(propertiesLocation);
核心问题是在Tomcat
中需要前缀java:comp/env/
。由于Spring
能够独立加载所有此平台,因此我尝试了Spring
加载JNDI
资源的可能性。
我发现我可以通过以下方式使用Spring的JndiTemplate
:
JndiTemplate jndiTemplate = new JndiTemplate();
Object lookup = jndiTemplate.lookup(propertiesLocation);
然而,这仍然取决于平台,需要在查找tomcat时使用java:comp/env
作为前缀。进一步了解StackOverflow
和Spring
javadocs,我找到了班级JndiLocatorSupport
,其中包含以下内容:
JNDI名称可能包含也可能不包含" java:comp / env /"访问本地映射(ENC - 环境命名上下文)资源时J2EE应用程序所期望的前缀。如果它没有," java:comp / env /"如果" resourceRef"前缀将被添加到前面。 property为true(默认值为false),没有给出其他方案(例如" java:")。
所以我创建了一个JndiObjectFactoryBean
扩展JndiLocatorSupport
,启用了setResourceRef
,但它似乎没有附加前缀。
核心问题:
使用以下代码时:
JndiObjectFactoryBean factoryBean = new JndiObjectFactoryBean();
factoryBean.setResourceRef(true);
Object lookup = factoryBean.getJndiTemplate().lookup(propertiesLocation);
我希望它具有与以下相同的效果:
JndiObjectFactoryBean factoryBean = new JndiObjectFactoryBean();
Object lookup = factoryBean.getJndiTemplate().lookup("java:comp/env/" + propertiesLocation);
但它没有。它似乎完全没有效果。但是,如果我查看源代码,它确实如下:
JndiObjectFactoryBean.lookup()
- > JndiObjectLocator.lookup()
- > JndiLocatorSupport.lookup()
,does call正确的方法。
答案 0 :(得分:3)
JndiObjectFactoryBean factoryBean = new JndiObjectFactoryBean();
factoryBean.setResourceRef(true);
Object lookup = factoryBean.getJndiTemplate().lookup(propertiesLocation);
和
JndiTemplate jndiTemplate = new JndiTemplate();
Object lookup = jndiTemplate.lookup(propertiesLocation);
关于查找是否相同。第一种是获得JndiTemplate
的非常复杂的方法。您执行的所有设置均适用于内部JndiObjectFactoryBean
的{{1}} NOT。基本上你的整个方法都没有添加任何东西。
而是使用JndiLocatorDelegate
并让它进行查找(不要尝试获取JndiTemplate
!)。
JndiTemplate
默认情况下会在JndiLocatorDelegate jndi = JndiLocatorDelegate.createDefaultResourceRefLocator();
Object lookup = jndi.lookup(propertiesLocation);
中执行查找,如果找不到,则会回退到普通java:comp/env
(您传入的内容)。