3

我有一个带有以下内容的 Spring-Boot-Aplication dependencyManagement

<dependencyManagement>
  <dependencies>
    <dependency>
      <!-- Import dependency management from Spring Boot -->
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-dependencies</artifactId>
      <version>2.1.5.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

以及以下内容dependencies

spring-boot-starter-jersey
spring-boot-starter-jdbc(exclusion:tomcat-jdbc) 
HikariCP(version:3.3.1)
ojdbc7

Tomcat上,我将JNDI-Datasource配置为:

<Resource name="jdbc/myDS" 
  type="javax.sql.DataSource" 
  driverClassName="oracle.jdbc.driver.OracleDriver" 
  username="Superuser" 
  password="secret"
  url="jdbc:oracle:thin:@xxxDbX"      
  ../>

.properties-file 中,我添加了以下属性:

spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource    
spring.datasource.jndi-name=jdbc/myDS

由于Spring-Boot能够从属性配置DataSource,我让它这样做并且我没有为DataSource编写额外的代码。部署在独立的 Tomcat中,它可以完美运行。

从逻辑上讲, Spring Boot嵌入式 Tomcat中找不到JNDI 资源,并将应用程序作为Spring-Boot-Application 启动我得到:

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to bind properties under 'spring.datasource.type' to java.lang.Class<javax.sql.DataSource>:

    Property: spring.datasource.type
    Value: org.apache.tomcat.jdbc.pool.DataSource
    Origin: class path resource [application.properties]:12:24
    Reason: No converter found capable of converting from type [java.lang.String] to type [java.lang.Class<javax.sql.DataSource>]

Action:

Update your application's configuration

我希望能够将应用程序作为Spring-Boot-Application 启动,并构建一个可以部署在任何Standalone Tomcat中的war文件。

properties如果应用程序作为Spring-Boot-Application 启动或者我必须有第二个.properties文件,这是否可以通过添加第二个 DataSource 来实现?

4

1 回答 1

1

对我有用的解决方案是添加一个自定义属性以用于嵌入式 Tomcat 服务器中的数据源,如下所示:

# for a dedicated Tomcat
spring.datasource.jndi-name=jdbc/dirserver


# for the embedded Tomcat

embedded.datasource.driver-class-name=oracle.jdbc.OracleDriver
embedded.datasource.url=jdbc:oracle:thin:@//myServer:1521/xxxxx
embedded.datasource.username=superuser
embedded.datasource.password=topsecret

并在使用@SpringBootApplication注释的类中定义@Bean DataSource

@SpringBootApplication
public class MySbApplication extends SpringBootServletInitializer {

  private static final Logger lg = LoggerFactory.getLogger(MySbApplication.class);

  @Value("${embedded.datasource.username}")
  String username;
  @Value("${embedded.datasource.password}")
  String password;
  @Value("${embedded.datasource.driver-class-name}")
  String driverClassName;
  @Value("${embedded.datasource.url}")
  String url;

  @Bean(destroyMethod = "")
  public DataSource oracledataSoutŕce() throws SQLException {
    final OracleDataSource dataSource = new OracleDataSource();
    dataSource.setUser(username);
    dataSource.setPassword(password);
    dataSource.setURL(url);
    dataSource.setImplicitCachingEnabled(true);
    dataSource.setFastConnectionFailoverEnabled(true);
    return dataSource;
  }
}

我将在Github中添加一个示例项目的链接。

于 2019-09-16T07:25:33.713 回答