我使用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 !!!
答案 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”目录中的上下文片段文件中,然后抛出一个例外:
答案 2 :(得分:1)
最简单的方法是配置您的配置。 ;)
使用Spring属性占位符。参见
基本思想是你只需在spring配置中放置一个带有属性的占位符,然后从属性文件中读取匹配的属性。您在构建过程中生成属性文件。我已经看到它在构建工具(ant)读取环境变量的地方完成,然后根据填充了标记的框架文件创建适合环境的属性文件。