2017-02-10 15 views
0

私はアプリケーションを持っています - Spring 4.3.6とSpring Boot 1.4.4を使用していますが、これはJARとしてエクスポートされます。リモートのOracleデータベースに接続したいが、アプリケーションを中断することなく構成を外部化するのに問題がある。DataSource用のSpringブート外部化構成が動作しない

これは私の現在の回避策です:上記で

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; 
} 

、私のアプリケーションがデータベースに接続し、正常にクエリを実行することができます。しかし、私は次のような構成をexternaliseしようとすると:私の春のブートコントローラ(上記の作品を外部ずにあることに注意)でjdbcTemplate.update(query)を実行しようとしたとき

@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 

私は、次のエラーが発生します。

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

@ConfigurationPropertiesを削除し、app.datasourcespring.datasourceに変更しようとしました。私もを返して、javax.sql.DataSourceを返そうとしましたが、どちらの場合も同じエラーがスローされます。

私は何か間違っています。設定を外部化するための正しい方法は何ですか?

+1

なぜあなたは自分の「データソース」を作成していますか... –

+0

私は自分自身を最初に作成していませんでした。 hsqldbを使用していましたが、Oracleデータベースへのアクセス権がありませんでした。私は質問をしましたが、答えはojdbcに変更することです、私はそれをしました。今ではjdbctemplateにautowireするBeanを見つけることができないので、私は春のリファレンス(これについて作業を始めてからn番目の時間)を読むようになりました。問題はDataSourceが何らかの形で存在しないということです私はおそらく私がカスタムデータソースとして数えていることを推測しているので、なぜ私はそれを作成しようとしています。そして、それは自動的にapplication.properties設定で自分自身を設定していません... – thegreatjedi

+0

hsqldbはオラクルではありません...それは決してうまくいかないでしょう。正しいドライバが必要であり、手動の設定が必要なドライバはありません。また、例外として、データソースはそこにありますが、接続ができないことを明示しています。したがって、おそらくあなたのユーザー名とパスワードの組み合わせに問題があります。基本的には設定を削除し、 'application.properties'再起動で' app.'を 'spring.'に置き換え、例外をチェックするだけです。 –

答えて

0

自分でDataSourceを作成する必要はありません。

、あなたのクラスパスおよびOracleドライバで

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

Dependecyを持っていることを確認して、あなたのapplication.propertiesファイルに次のプロパティを置く:あなたのDataSource@Autowiredすることができるはずその後

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 

さらに詳しい情報は、 をご覧ください。

0

スプリングブートによって提供される事前定義プロパティを上書きすることはできません。

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; 
    }  
} 

ますのでご注意ください

インスタンス変数名がキー
  • datasourceの第二の部分と同じであるdatasourceある
    1. は、次の2つがあるとクラスレベルのインスタンス
  • 1

    です2つの異なる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/ 
    

    がapplication.propertiesファイルが除外されていることを確認瓶

    を構築するとき
    関連する問題