2017-02-10 115 views
0

我有一個應用程序 - 使用Spring 4.3.6和Spring Boot 1.4.4 - 它將作爲JAR導出。我想連接到遠程Oracle數據庫,但是我無法在不中斷應用程序的情況下對配置進行外部化。DataSource的Spring Boot外部配置不能正常工作

這是我目前的解決方法:

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 

我會試着在我的春節,引導控制器執行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,但在這兩種情況下都會引發同樣的錯誤。

我做錯了什麼。什麼是成功實現外部配置的正確方法?

+1

爲什麼你甚至創建自己的'DataSource' ... –

+0

我一開始並沒有創建自己的。我使用的是hsqldb,但它沒有訪問Oracle數據庫的權限。我問了一個問題,答案是更改爲ojdbc,所以我這樣做了。現在,它找不到自動裝入jdbctemplate的bean,所以我去閱讀spring reference(自從我開始工作以來的第n次),我認爲問題在於DataSource不知何故不存在,所以我猜我在做什麼可能會算作一個自定義的數據源,因此我試圖創建一個。現在它不會自動使用application.properties設置進行自我配置... – thegreatjedi

+0

hsqldb不是oracle ...所以很明顯,它永遠不會工作。您需要正確的驅動程序,並且這些都不需要手動配置。此外,例外狀態(清楚地)表示數據源在那裏,但無法建立連接,因此(可能)您的用戶名/密碼組合有問題。基本上所有你需要的是刪除你的配置,在'application.properties'重新啓動時用'spring.'替換'app.'並檢查你的異常。 –

回答

0

應該沒有必要自己創建DataSource

確保您有

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

Dependecy在類路徑和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 

之後,你應該能夠@AutowiredDataSource

欲瞭解更多信息,在看看: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html#boot-features-connect-to-production-database

0

您無法覆蓋由spring引導提供的預定義屬性。

只需使用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 
} 

現在,實際的配置/組件類應如下所示。

@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第二部分是一個類級別的實例
1

假設你有兩個數據源用於兩個不同的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; 
    } 
} 

如果你想運行的罐子時指定的application.properties文件的外部位置,然後設置spring.config.location的系統屬性,你可以嘗試:

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

確保application.properties文件被排除建設的jar

相關問題