2016-03-24 31 views
1

我試圖加載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正確的方法。

回答

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而不是針對內部JndiTemplate。基本上你的整個方法不會增加任何東西。

取而代之的是使用JndiLocatorDelegate並讓它進行查找(不要試圖獲得JndiTemplate!)。

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

默認將做一個查找在java:comp/env,如果沒有找到做回退到一個普通propertiesLocation(你傳遞)。