我試圖加載JNDI提供的屬性文件,它應該是獨立於平臺的。我知道我可以通過以下方式做到這一點,依賴於平臺:Spring&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
的javadoc進一步看,我發現類JndiLocatorSupport
,其具有如下:
JNDI名稱可能會或可能不包括「的java:comp/env的/」前綴的J2EE應用程序預計訪問時一個本地映射(ENC - 環境命名上下文)資源。如果沒有,那麼如果「resourceRef」屬性爲true(缺省值爲false)並且沒有給出其他方案(例如「java:」),則前綴「java:comp/env /」將被前置。
所以我創建了一個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正確的方法。