春天& JNDI:找到独立于资源平台的

时间:2016-03-24 14:45:13

标签: java spring tomcat weblogic jndi

我试图加载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作为前缀。进一步了解StackOverflowSpring 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正确的方法。

1 个答案:

答案 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(您传入的内容)。