Tomcat与Jetty JNDI Lookup

时间:2010-11-30 03:05:57

标签: spring tomcat jetty tomcat6 jndi

我使用Spring配置我的Java Web App,在Spring配置中,我通过JNDI为Jetty获取数据源,如下所示:

<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配置文件。 HELP !!!

3 个答案:

答案 0 :(得分:7)

我找到了答案here,但我认为这有点复杂,但它确实让我想到使用博客发现的非常酷的ServerDetector类。

一旦我可以动态地计算出我正在运行的服务器类型,我就可以使用Spring表达式语言来完成剩下的工作:

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

容易!

答案 1 :(得分: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>

不确定这是否理想,但确实有效。

<强>更新

如果你将你的jetty-env.xml文件放在WAR中,它会起作用......但无论出于何种原因,你可以将这个配置移到WAR外面并放入Jetty的“contexts”目录中的上下文片段文件中,然后抛出一个例外:

检查出来:http://jira.codehaus.org/browse/JETTY-273

答案 2 :(得分:1)

最简单的方法是配置您的配置。 ;)

使用Spring属性占位符。参见

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

基本思想是你只需在spring配置中放置一个带有属性的占位符,然后从属性文件中读取匹配的属性。您在构建过程中生成属性文件。我已经看到它在构建工具(ant)读取环境变量的地方完成,然后根据填充了标记的框架文件创建适合环境的属性文件。