2010-11-30 36 views
6

我使用Spring來配置我的Java Web應用程序,並在我的Spring配置我通過JNDI獲得數據源的碼頭如下:的Tomcat VS碼頭JNDI查找

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/myDataSource" />

但這不會使用Tomcat工作。而對於Tomcat我必須這樣做:

<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/myDataSource" />

最新最好的方式來解決這個問題?我已經使用JNDI作爲外部化配置的一種方式,所以我無法外化我的外部化配置!同時,我絕對不贊同有兩個獨立的Spring配置文件的想法。幫幫我!!!

回答

7

我找到了答案here,但我認爲這是一個有點複雜,但它確實給我的想法,使用非常酷ServerDetector類該博客發現。

有一次,我可以動態圖什麼類型的,我在正在運行的服務器,我可以使用Spring表達式語言做的工作的其餘部分:

<jee:jndi-lookup id="myAppDataSource" 
    jndi-name="#{ (AppServerType == 'Jetty' ? 'jdbc/' : 'java:comp/env/jdbc/') + 
        'myAppDataSource' }" /> 

輕鬆!

1

最簡單的方法是配置您的配置。 ;)

使用Spring屬性佔位符。見

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-placeholderconfigurer

的基本想法是,你只是把一個佔位符在Spring的配置與屬性,然後讀取匹配屬性從一個屬性文件。您在構建過程中生成屬性文件。我已經看到它在構建工具(ant)讀取環境變量的地方完成,然後基於用令牌填充的骨架文件創建適合環境的屬性文件。

+0

你是說,然後使用屬性佔位符的這個值作爲jndi名?或者完全跳過JNDI? – HDave 2010-11-30 04:47:11

+1

@hdave,配置jndi-name爲=「{jndi.name}」,其中jndi.name是構建過程生成的構建文件中的一個屬性。似乎你已經解決了這個問題,但是這個技術最終肯定會對你有用。 – hvgotcodes 2010-11-30 14:11:49

4

經過一番嘗試,我發現我可以強制Jetty使用與Tomcat相同的JNDI路徑。下面的代碼片斷是從我jetty-env.xml文件:如果

<New id="myDataSource" class="org.mortbay.jetty.plus.naming.Resource"> 
    <!-- We MUST specify the entire JNDI path here to force compliance with the Tomcat/J2EE convention --> 
    <Arg>java:comp/env/jdbc/myDataSource</Arg> 
    <Arg> 
    <New class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean"> 
    <Set name="uniqueResourceName">sbeDatabase</Set> 
       ............... 
    </New> 
    </Arg> 
</New> 

不知道這是理想的,但它的工作原理。

更新

,如果你把你的碼頭-env.xml文件中的WAR內它的工作原理......但無論出於何種原因,一個你移動外戰並進入一個語境片斷文件,該配置碼頭的「上下文」目錄,然後它拋出一個異常:

檢查出來:http://jira.codehaus.org/browse/JETTY-273