Spring Boot外置Tomcat7配置JNDI连接Oracle报错:JNDI名称与上下文无关联
修复步骤
1. 清理冲突的JNDI配置
你现在同时配置了多份JNDI规则,优先留一套即可,不要混配:
- 删掉Tomcat全局
web.xml里添加的resource-ref配置,该配置仅需要放在应用自身的WEB-INF/web.xml中 - 若使用应用内部
/src/main/webapp/META-INF/context.xml配置数据源,就删除server.xml里的Resource配置、Tomcat全局context.xml里的ResourceLink配置,同时删除应用context.xml里多余的ResourceLink标签(你已经在同一个文件里定义了Resource,不需要再配链接) - 若使用Tomcat全局配置,就删除应用
META-INF/context.xml文件,避免优先级冲突
2. 修复代码逻辑错误
- 你在
ControlerConnection中直接new TDFAdminDBConnection(),没有将该类交给Spring容器托管,所以类中定义的LogService log_dbg根本不会被注入,调用log_dbg.debug()时直接触发空指针,就是你控制台看到的堆栈异常来源。要么给TDFAdminDBConnection加@Component注解,在ControlerConnection中用@Autowired注入实例,要么先注释掉所有log_dbg.debug相关代码先排查JNDI问题 - JNDI查找可以直接写全路径测试,修改查找代码为:
Context initCtx = new InitialContext(); this.ds = (DataSource) initCtx.lookup("java:comp/env/rnz_fta/jdbc/Datasource");
3. 修正Spring Boot配置
你已经引入了spring-boot-starter-jdbc,完全不需要自己手写JNDI查找逻辑:
- 在
application.properties中配置完整的JNDI路径:
spring.datasource.jndi-name=java:comp/env/rnz_fta/jdbc/Datasource
- 直接在需要使用数据库连接的位置用
@Autowired注入Spring自动生成的DataSource实例即可
4. 修正依赖冲突
你已经把ojdbc6.jar放到了Tomcat的lib目录,需要修改Maven中ojdbc6的依赖范围,避免包冲突:
<dependency> <groupId>oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0.3</version> <scope>provided</scope> </dependency>
备用快速方案
如果JNDI配置始终有问题,可以直接放弃容器数据源配置,用Spring Boot自带的JDBC自动配置,在application.properties中添加以下配置即可直接使用:
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver spring.datasource.url=jdbc:oracle:thin:@xxx:1509:xxx spring.datasource.username=xxx spring.datasource.password=xxx spring.datasource.max-active=20 spring.datasource.max-idle=10 spring.datasource.max-wait=5000
内容的提问来源于stack exchange,提问作者Manel BEN AMARA
相关产品推荐
相关产品推荐

