Tomcat与Jetty JNDI Lookup

HDa*_*ave 6 spring tomcat jndi jetty tomcat6

我使用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配置文件.救命!!!

HDa*_*ave 7

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

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

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

简单!


HDa*_*ave 5

经过一些试验,我发现可以强制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>
Run Code Online (Sandbox Code Playgroud)

不知道这是否理想,但是否可行。

更新

如果将jetty-env.xml文件放入WAR中,则可以使用该文件...但是出于某种原因,您可以将该配置移到WAR之外,并放入Jetty的“ contexts”目录中的上下文片段文件中,然后抛出异常:

检查一下:http : //jira.codehaus.org/browse/JETTY-273