2017-10-25 5 views
0

必要なすべてのプロパティを列挙せずにファイルを取得するために、私は私のプロパティをロードしています以下のようにファイル:春 - どのようにプロパティのサブセットが

@Configuration 
@PropertySource("classpath:app.properties") 
class MyApp { 
    @Bean 
    public PropertySourcesPlaceholderConfigurer PropertySourcesPlaceholderConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 
} 

をプロパティファイルでは、私はいくつかのデータベース関連のプロパティがあります。

database.dataSource.url=jdbc:postgresql://localhost:${db-port:5432}/mydb 
database.dataSource.x=... 
database.dataSource.y=... 
database.dataSource.z=... 

注:

  • ${db-port}のいずれかに置き換える必要がありますプロパティ/環境変数の値はdb-portまたは5432です。私の場合は、Tomcatコンテナを生成するときに環境変数db-portを定義しています。

  • すべてのデータベース関連のプロパティは、database.のルートにグループ化されています。これは意図的なものです。以下を参照してください。

私はハードコーディング/私のコード内のすべての可能なデータベース関連のプロパティを列挙しなければならないことを避けたいです。幸いにも、使用しているデータベースレイヤー(光)には、java.util.Propertiesですべてのプロパティを渡すことができるという素晴らしい機能があります。だから、私はdatabase.*の下にすべての定義されたプロパティを取得し、単純にそれを光に転送したい。このため

、私は次のユーティリティを書いた:get("database.")を呼び出すときにプロパティファイルで定義されている

@Component 
public class PropertyFetcher 
{ 
    @Autowired 
    private ConfigurableEnvironment environment; 

    public Properties get(final String key) { 
     final Properties p = new Properties(); 

     for (final PropertySource<?> s : environment.getPropertySources()) { 
      if (s instanceof EnumerablePropertySource) { 
       for (final String k : ((EnumerablePropertySource) s).getPropertyNames()) { 
        if (k.startsWith(key) && k.length() > key.length()) { 
         p.put(k.substring(key.length()), s.getProperty(k)); 
        } 
       } 
      } 
     } 
     return p; 
    } 
} 

を、私はすべてのデータベース関連のプロパティを持っています。すばらしいです!このルート(ConfigurableEnvironment)を経由する場合でも、プロパティdataSource.urlの値は、何らかの理由で、${db-port:5432}は(まだ?)解決されていない今

jdbc:postgresql://localhost:${db-port:5432}/mydb 

の代わりに、そう

jdbc:postgresql://localhost:9876/mydb 

されます。

どのようにこれを修正できますか?または、コードに列挙したりハードコードしたりせずに、特定のルートの下にあるすべてのプロパティを取得するより良い方法がありますか?

デフォルトのシナリオでは、database.dataSource.url=jdbc:postgresql://localhost:${db-port:5432}/mydb${db-port:5432}が正しく解決されています。私はこれを次のメンバーを定義してログオンしてテストしました:

@Value("${database.dataSource.url}") 
final String url; // holds jdbc:postgresql://localhost:9876/mydb 

答えて

1

実際の環境からのプロパティ値のみを読みます。それでは、あなただけが実際のまたは実効値のプロパティを得るでしょう。

これはコードに少し変更が必要です。

変更この行:これまで

p.put(k.substring(key.length()), s.getProperty(k)); 

p.put(k.substring(key.length()), environment.getProperty(k)); 
+0

グレート、これはそれを修正!私はすでに環境( 'ConfigurableEnvironment')を持っていたので、' environment.getProperty(k) 'と呼んでいます!あるいは 'Environment'(' ConfigurableEnvironment'ではなく)を別々に注入するのがよい理由はありますか? – Jessy56

+0

ConfigurableEnvironmentは環境を拡張します。ですから、1回の注射だけで良いのです。その点をありがとう。私はそれに応じて答えを更新します。 –

+0

素晴らしい!どうもありがとう。 – Jessy56

関連する問題