【发布时间】:2018-09-28 10:01:07
【问题描述】:
在我的时区早上好
我已经关注了这两个 Stack Overflow 问题:
Spring Boot Using Embedded Tomcat with JNDI
和
Howto use JNDI database connection with Spring Boot and Spring Data using embedded Tomcat?
而且没有一个有效。 我正在使用 Spring Boot 2。 我想配置嵌入式 Tomcat 服务器以使用 JNDI。 我已经尝试过:
代码片段:
@SpringBootApplication
public class MyApplication {
public static void main ...
@Bean
public ServletWebServerFactory servletContainer() { TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
ContextResource resource = new ContextResource();
resource.setName("jdbc/CCC");
resource.setType(DataSource.class.getName());
resource.setProperty("driverClassName", "oracle.jdbc.driver.OracleDriver");
resource.setProperty("url", "jdbc:oracle:thin:@a77k11111188.tt.ddd.test:3000:BHJR00TT00");
resource.setProperty("username", "user");
resource.setProperty("password", "pass");
context.getNamingResources().addResource(resource); }
@Override
protected TomcatWebServer getTomcatWebServer(Tomcat tomcat){
tomcat.enableNaming();
TomcatWebServer container = super.getTomcatWebServer(tomcat);
for(Container child :container.getTomcat().getHost().findChildren()){
if (child instanceof Context) {
ClassLoader contextClassLoader = ((Context)child).getLoader().getClassLoader();
Thread.currentThread().setContextClassLoader(contextClassLoader);
break;
}
}
return container; }
}; return tomcat;
然后使用application.properties
spring.datasource.jndi-name=java:comp/env/jdbc/CCC
错误日志:
无法启动嵌入式 Tomcat
创建名为“servletEndpointRegistrar”的 bean 时出错
创建名为“dataSource”的 bean 时出错
DataSourceLookupFailureException:无法查找名为“java:comp/env/jdbc/CCC”的 JNDI 数据源
.NamingException: 无法创建资源工厂实例
ClassNotFoundException: org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory
相反,如果我不使用应用程序属性,而是像这样直接在 Spring Boot 应用程序中配置数据源 bean
@Bean(destroyMethod = "")
public DataSource jndiDataSource() throws IllegalArgumentException, NamingException {
JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
bean.setJndiName("java:comp/env/jdbc/CCC");
bean.setProxyInterface(DataSource.class);
bean.setLookupOnStartup(false);
bean.afterPropertiesSet();
return (DataSource) bean.getObject();
}
错误日志
UnsatisfiedDependencyException:创建名为“entityManagerFactory”的 bean 时出错
BeanCreationException:创建名为“jpaVendorAdapter”的 bean 时出错
JndiLookupFailureException: JndiObjectTargetSource 未能获得新的目标对象
NamingException: 无法创建资源工厂实例
在我的 pom 中,我有以下依赖项
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc7</artifactId>
<version>12.1.0.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
我没有解决方案 提前致谢 最好的问候
【问题讨论】:
标签: spring-boot spring-jdbc embedded-tomcat-8