必要なすべてのプロパティを列挙せずにファイルを取得するために、私は私のプロパティをロードしています以下のようにファイル:春 - どのようにプロパティのサブセットが
@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
グレート、これはそれを修正!私はすでに環境( 'ConfigurableEnvironment')を持っていたので、' environment.getProperty(k) 'と呼んでいます!あるいは 'Environment'(' ConfigurableEnvironment'ではなく)を別々に注入するのがよい理由はありますか? – Jessy56
ConfigurableEnvironmentは環境を拡張します。ですから、1回の注射だけで良いのです。その点をありがとう。私はそれに応じて答えを更新します。 –
素晴らしい!どうもありがとう。 – Jessy56