【发布时间】:2016-07-12 10:51:55
【问题描述】:
我一直在处理一个问题,即在运行axis2 web 服务的上下文中找不到JNDI 名称。当我使用 spring 时,这个问题只出现在 Tomcat 8 中。 一些细节:(我将提供相关的元素) 1.services.xml
<service name="ScoreService" class="com.bpl.ws.service.ScoreServiceInitializer">
<description>Simple test service</description>
<parameter name="ServiceObjectSupplier" locked="false">org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier</parameter>
<parameter name="SpringBeanName" locked="false">scoreService</parameter>
2。 server.xml:
<Host name="localhost" appBase="webapps" xmlBase="C:\Applications\apache-tomcat-8.0.30-windows-x64\context"
unpackWARs="true" autoDeploy="true">
-
上下文.xml
<JarResources className="org.apache.catalina.webresources.DirResourceSet" base="C:\Applications\apache-tomcat-8.0.30-windows-x64\commonLib" webAppMount="/WEB-INF/lib"/>
4.上下文文件中的JNDI资源:
<Resource name="jdbc/ADS" auth="Container"
factory="com.bpl.ws.EncryptedJdbcDataSourceFactory"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@xxxxxxx.com:3203/xxxx"
username="xxxxx"
password="xxxx"
initialSize="10"
logAbandoned="false"
maxActive="20"
maxIdle="10"
maxWait="10000"
removeAbandoned="true"
removeAbandonedTimeout="120"
jdbcInterceptors="QueryTimeoutInterceptor(queryTimeout=10)"
testOnBorrow="true"
validationInterval="30000"
validationQuery="Select 1 from dual"/>
如 services.xml 文件列表所示,我使用了一个初始化器类,加载 spring 上下文的代码如下所示: 4.ScoreSerivceInitializer
public void startUp(ConfigurationContext ignore, AxisService service) {
System.out.println("SCORESERVICE:: Starting up..");
DataSource ds;
ClassLoader cloader = service.getClassLoader();
Thread.currentThread().setContextClassLoader(cloader);
System.out.println("SCORESERVICE:: spring context starting up");
spContext = new ClassPathXmlApplicationContext(new String[] {"DST-Context.xml"},false);
spContext.setClassLoader(cloader);
try {
spContext.refresh();
- spring context.xml (DST-Context.xml)
DST-Context.xml 条目如下所示:
<bean id="applicationContext"
class="org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder" />
<bean id="datasource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/ADS</value>
</property>
</bean>
-
Tomcat 日志:
[WARN] 上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.BeanCreationException:创建类路径资源 [DST-Context.xml] 中定义的名称为“datasource”的 bean 时出错:调用 init方法失败;嵌套异常是 javax.naming.NameNotFoundException:名称 [java:comp/env/jdbc/ADS] 未绑定在此上下文中。找不到 [java:comp].org.springframework.beans.factory.BeanCreationException:在类路径资源 [DST-Context.xml] 中定义名称为“datasource”的 bean 创建错误:调用 init 方法失败;嵌套异常是 javax.naming.NameNotFoundException: 名称 [java:comp/env/jdbc/ADS] 未绑定在此上下文中。找不到 [java:comp]。
在不改变任何配置的情况下,如果我改变 ScoreServiceInitializer 来做到这一点:
initCtx = new InitialContext();
envCtx = (Context) initCtx.lookup("java:comp/env");
ds = (DataSource)
envCtx.lookup("jdbc/ADS");
一切正常。正如您在此处看到的,我没有使用任何 spring,并且 jndi 数据源在上下文中。
如果我在 Tomcat 7 中使用 spring config 部署代码,它可以正常工作。 spring 上下文似乎是问题,但已经研究了一段时间,似乎无法弄清楚为什么 Tomcat 8 与 Tomcat 7 有不同的行为。我知道 Tomcat8 在资源方面改变了一些行为已配置并且 dbcp 现在是 dbcp2 并且我已经相应地更新了配置文件。 任何帮助是极大的赞赏。如果需要任何其他信息,请告诉我。
【问题讨论】:
-
这个问题只在windows环境下。相同的 aar 和相同的设置适用于 unix 环境。
-
可能很愚蠢的问题:你为什么要和
ClassLoaders 玩游戏? -
@ChristopherSchultz:我假设这个问题是因为这两行:ClassLoader cloader = service.getClassLoader(); Thread.currentThread().setContextClassLoader(cloader);如果我不这样做,Spring 将无法找到打包在 aar 中的 applicationcontext 文件。
-
与axis2 1.5.1完全相同的问题,升级到axis2 1.6.1抛出
NoClassDefFoundError: org/springframework/context/ApplicationContextAware
标签: windows spring jndi axis2 tomcat8