Tomcat与Jetty的JNDI查找对比

6
我使用Spring配置我的Java Web应用程序,在我的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配置文件。救命啊!
3个回答

7
我在这里找到了一个答案(链接),但我认为它有点复杂,但它确实给了我使用非常酷的ServerDetector类的想法。
一旦我可以动态地确定我正在运行的服务器类型,我就能够使用Spring表达式语言来完成其余的工作:
<jee:jndi-lookup id="myAppDataSource" 
    jndi-name="#{ (AppServerType == 'Jetty' ? 'jdbc/' : 'java:comp/env/jdbc/') + 
                  'myAppDataSource' }" />

容易!


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>

不确定这是否理想,但它可以工作。

更新:

如果您将jetty-env.xml文件放在WAR内部,则它可以工作...但由于某种原因,一旦将此配置移动到Jetty的“contexts”目录中的上下文片段文件中,就会抛出异常:

请查看:http://jira.codehaus.org/browse/JETTY-273


我喜欢这个,因为它不依赖于Spring那种XML癌症。 - user177800

1

最干净的方法是配置您的配置文件。;)

使用Spring属性占位符。请参见

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

基本思路就是在你的spring配置文件中使用一个占位符来表示属性,然后从属性文件中读取匹配的属性。你可以在构建过程中生成属性文件。我曾经见过一种方法是,构建工具(如ant)会读取环境变量并根据填充有令牌的骨架文件创建适合该环境的属性文件。

你是说要使用属性占位符中的值作为JNDI名称吗?还是完全跳过JNDI? - Dave
1
@hdave,将jndi-name配置为="{jndi.name}",其中jndi.name是由您的构建过程生成的buildfile中的属性。看起来您已经解决了这个问题,但这种技术最终肯定会对您有所帮助。 - hvgotcodes
我认为这将是可以的,因为我很快会转向支持Websphere,并且我了解它对JNDI路径有自己独特的方法。 - Dave
我刚意识到这种方法会导致一个特定于应用服务器的WAR文件,因为它将在其中包含一个经过过滤的属性文件。我正在寻找一种单一的方法,它将根据应用服务器动态地自我调整。 - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接