簡體   English   中英

Spring Boot的DataSource外部化配置不起作用

[英]Spring Boot externalised configuration for DataSource not working

我有一個應用程序-使用Spring 4.3.6和Spring Boot 1.4.4-將被導出為JAR。 我想連接到遠程Oracle數據庫,但是在不破壞應用程序的情況下無法外部化配置。

這是我當前的解決方法:

import org.apache.tomcat.jdbc.pool.DataSource;

@Bean
public DataSource dataSource() {
  DataSource dataSource = new DataSource();

  dataSource.setUrl("jdbc:oracle:thin:@ip-address:port:orcl");
  dataSource.setUsername("user");
  dataSource.setPassword("password");
  dataSource.setDriverClassName("oracle.jdbc.OracleDriver");

  return dataSource;
}

通過以上操作,我的應用程序能夠連接到數據庫並成功執行查詢。 但是,當我嘗試將配置外部化時,如下所示:

@Bean
@ConfigurationProperties(prefix="app.datasource")
public DataSource dataSource() {
  return new DataSource();
}

// application.properties
app.datasource.url=jdbc:oracle:thin:@ip-address:port:orcl
app.datasource.username=user
app.datasource.password=password
app.datasource.driver-class-name=oracle.jdbc.OracleDriver

當嘗試在我的Spring Boot Controller中執行jdbcTemplate.update(query)時,我將得到以下錯誤(請注意,沒有外部化上述工作):

org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: The url cannot be null

我試圖刪除@ConfigurationProperties並將app.datasource更改為spring.datasource 我也嘗試過使用DataSourceBuilder.create().build()返回javax.sql.DataSource但是在兩種情況下都會引發相同的錯誤。

我做錯了。 成功外部化配置的正確方法是什么?

假設您有兩個不同的Oracle數據庫的兩個數據源。 然后,您具有以下屬性文件:

/path/to/config/application.properties

oracle1.username=YourUser1
oracle1.password=YourPassword1
oracle1.url=jdbc:oracle:thin:@localhost:1521:XE

oracle2.username=YourUser2
oracle2.password=YourPassword2
oracle2.url=jdbc:oracle:thin:@192.168.0.3:1521:XE

然后在配置文件中:

import oracle.jdbc.pool.OracleDataSource;

@Configuration
public class DatasourcesConfig {

@Autowired
private Environment env;

@Primary
@Bean(name = "dataSource1")
DataSource oracle1DataSource() throws SQLException {

    OracleDataSource dataSource = new OracleDataSource();
    dataSource.setUser(env.getProperty("oracle1.username"));
    dataSource.setPassword(env.getProperty("oracle1.password"));
    dataSource.setURL(env.getProperty("oracle1.url"));
    return dataSource;
}

@Bean(name = "dataSource2")
DataSource oracle2DataSource() throws SQLException {

    OracleDataSource dataSource = new OracleDataSource();
    dataSource.setUser(env.getProperty("oracle2.username"));
    dataSource.setPassword(env.getProperty("oracle2.password"));
    dataSource.setURL(env.getProperty("oracle2.url"));
    return dataSource;
  }
}

如果要在運行jar時指定application.properties文件的外部位置,然后將spring.config.location設置為系統屬性,則可以嘗試:

java -jar target/your-application-0.0.1.jar -Dspring.config.location=/path/to/config/

確保在構建jar時排除了application.properties文件

無需自己創建DataSource

確保您有

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
</dependency>

在您的類路徑和oracle驅動程序中進行依賴,並在application.properties文件中放置以下屬性:

spring.datasource.url=jdbc:oracle:thin:@ip-address:port:orcl
spring.datasource.username=user
spring.datasource.password=password
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver

之后,您應該可以@Autowired您的DataSource

有關更多信息,請參見: https : //docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html#boot-features-connect-to-production-database

您不能覆蓋Spring Boot提供的預定義屬性。

只需在application.properties文件中使用以下屬性。

spring.datasource.url=jdbc:oracle:thin:@ip-address:port:orcl
spring.datasource.data-username=user
spring.datasource.data-password=password
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver

另請參閱: https : //docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

除此之外,在類級別使用@ConfigurationProperties進行澄清,並且前綴"app"而不是"app.datasource"

@ConfigurationProperties(prefix = "app")

現在,您有一個名為DbProperties的類,並且該類的屬性與application.properties鍵的最后一部分相同

public class DBProperties {
    private String url;
    private String username;
    private String password;
    // setters and getters
}

現在,實際的config / component類應該如下所示。

@Component
@ConfigurationProperties(prefix = "app")
public class MyComponent {
    DBProperties datasource = new DBProperties();

    public DBProperties getDatasource() {
        return datasource;
    }

    public void setDatasource(DBProperties datasource) {
        this.datasource = datasource;
    }    
}

請注意

  1. 實例變量名稱是datasource ,它與鍵的第二部分相同
  2. datasource是一個類級別的實例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM