我一直在解决在 axis2 Web 服务运行的上下文中找不到 JNDI 名称的问题。当我使用 spring 时,仅在 Tomcat 8 中出现此问题。
一些细节:(我将提供相关的元素)
1. 服务.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.服务器.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.ScoreServiceInitializer
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>
-
汤姆猫日志:
[警告] 上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.BeanCreationException:创建类路径资源中定义的名为“datasource”的 bean 时出错 [DST-Context.xml]:调用 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 配置部署代码,它可以正常工作。
spring 上下文似乎是问题所在,但已经研究了一段时间,似乎无法弄清楚为什么 Tomcat 8 与 Tomcat 7 相比有不同的行为。我知道 Tomcat8 在资源的方式方面改变了一些行为配置完毕,dbcp 现在是 dbcp2,我已经相应地更新了配置文件。
任何帮助是极大的赞赏。如果需要任何其他信息,请告诉我。