2016-06-14 4 views
4

私は2つ(またはそれ以上)の異なる構成プロパティファイルをプロジェクトに配置しており、それぞれ異なるデータソース用にロードする必要があります。複数のファイルからの複数のデータソースのスプリングデータ

私は次のように実行しようとしました:

@Bean 
@ConfigurationProperties(locations = {"#{myconfigroot.getRootFolder()}/datasource1.properties"} 
public static DataSource getFirstDatasource() { 
    return DataSourceBuilder.create().build(); 
} 

しかし、明らかに、これはConfigurationProperties注釈の位置プロパティとして機能しませんがSPELを経由しません。 myconfigroot.getRootFolder()は、datasource1.propertiesへのパスを返す静的メソッドです。

アドバイスをしてください。ありがとう。

=====編集=======

私は、誰かが自分のアプリケーションが異なる設定ファイルをロードしたいたいとき、これは共通の問題であると考えています。何らかの理由により、ファイルの場所と名前を起動スクリプトやコマンドラインに入れることができないか、実行時にのみパスを特定することができます。そのため、Beanの作成中にパスを読み込む必要があります。

PropertySourcePlaceHolderConfigurerを一度試しましたが、うまくいかないようです。

誰でもライトを共有できますか?

答えて

2

最新のSpringブート(バージョン1.3.5)はこの場合SpELをサポートしていません。注釈の

参照Javadocを逆{@code @value}、のSpeI式であること@ConfigurationProperties

注ない プロパティ値を外部化されているので、評価しました。

私は次のように春のブートデフォルトの動作をカスタマイズする方法を見つけました:

例えば、私は、実行時前に場所を得ることができない何らかの理由で、どこかにdatabase.propertiesファイルを持っています。

したがって
username=mike 
password=password 

、プロパティにPOJOマッピングを定義します。

@Component 
@ConfigurationProperties(locations = "myConfiguration")// myConfiguration is customized placeholder 
public class MyProperties{ 
    String username; 
    String password; 
    //Getters, Setters… 
} 

次に、デフォルトStandardEnvironment延長する:

public class MyEnvironment extends StandardEnvironment { 
    @Override 
    public String resolvePlaceholders(String location) { 
     if (location.equals("myConfiguration")) { 
     //Whatever you can do, SpEL, method call... 
     //Return database.properties path at runtime in this case 
     return getRootFolder() + "datasource.properties"; 
     } else { 
     return super.resolvePlaceholders(text); 
     } 
    } 
} 

最後に、春にそれを適用するには、mainメソッドのエントリをブートします

@SpringBootApplication 
public class MyApplication extends SpringBootServletInitializer { 
public static void main(String[] args) { 
    new SpeedRestApplication() 
     .configure(new SpringApplicationBuilder(SpeedRestApplication.class).environment(new MyEnvironment()))//Replace default StandardEnvironment 
     .run(args); 
    } 
} 

Springブートが起動すると、MyPropertiesのbean名とパスワードフィールドがdatabase.propertiesから注入されます。次に、コンフィグレーションとしてMyProperties beanを他のbeanに配線することができます。

希望すると助かります!

public class DatasourcePostProcessor implements EnvironmentPostProcessor { 
    @Override 
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { 
     Properties p = new Properties(); 
     p.load(new FileInputStream(new File(getRootFolder() + "/datasource1.properties"))); 
     Map<String, Object> propMap = new HashMap<>(); 
     for (Map.Entry<Object, Object> entry : p.entrySet()) { 
      propMap.put(entry.getKey().toString(), entry.getValue()); 
     } 
     MapPropertySource source = new MapPropertySource("datasource1", propMap); 
     environment.getPropertySources().addLast(source); 
    } 
} 

とspring.factoriesに環境ポストプロセッサを登録します:とにかく

org.springframework.boot.env.EnvironmentPostProcessor=com.myorg.test.DatasourcePostProcessor 

、これは人々を支援を期待して受け入れる

1

私は最終的に、それは次のような機構を使用して動作しましたそれは私を啓蒙するように最初のanwer。

私は環境と財産ソースの配線方法が見つかりました::How to configure a custom source to feed Spring Boot's @ConfigurationProperties

:私は、カスタマイズされたプロパティファイルをロードする方法を見つけ https://github.com/spring-projects/spring-boot/issues/4595

も研究中に発見されたGoogle検索から以下の参考文献を投稿

関連する問題