1. ホーム
  2. spring

[解決済み] Map または Properties オブジェクトとしてすべての環境プロパティにアクセスする

2023-01-11 06:08:53

質問

アノテーションを使用して、以下のようにspring環境を設定しています。

@Configuration
...
@PropertySource("classpath:/config/default.properties")
...
public class GeneralApplicationConfiguration implements WebApplicationInitializer 
{
    @Autowired
    Environment env;
}

これは、私のプロパティにつながる default.properties に含まれることになります。 Environment . を使いたいのですが @PropertySource のメカニズムを使いたいと思います。なぜなら、すでにいくつかのフォールバック層と、環境設定に基づいた異なる動的な場所 (例えば config_dir の場所) を通じて、プロパティをオーバーロードする可能性を提供しているからです。私は、例を簡単にするためにフォールバックを取り除いただけです。

しかし、今問題なのは、例えばデータソースのプロパティを default.properties . データソースがどのような設定を要求しているのかを詳しく知らなくても、データソースに設定を渡すことができます。

Properties p = ...
datasource.setProperties(p);

ただし、問題なのは Environment オブジェクトはどちらも Properties オブジェクトでも Map も、それに匹敵するものもありません。私の見解では、環境のすべての値にアクセスすることは不可能です。 keySet または iterator メソッドやそれに匹敵する何かです。

Properties p <=== Environment env?

私は何かを見逃しているのでしょうか?のすべてのエントリにアクセスすることは可能でしょうか? Environment オブジェクトのすべてのエントリにアクセスすることはできますか?もしそうなら、私はエントリーを Map または Properties オブジェクトを作成すると、プレフィックスでフィルタリングしたりマッピングしたりすることもできます。 Map ... これは、私がやりたいことです。何か提案はありますか?

どのように解決するのですか?

このようなものが必要です。おそらく改善されるでしょう。これは最初の試みです。

...
import org.springframework.core.env.PropertySource;
import org.springframework.core.env.AbstractEnvironment;
import org.springframework.core.env.Environment;
import org.springframework.core.env.MapPropertySource;
...

@Configuration
...
@org.springframework.context.annotation.PropertySource("classpath:/config/default.properties")
...
public class GeneralApplicationConfiguration implements WebApplicationInitializer 
{
    @Autowired
    Environment env;

    public void someMethod() {
        ...
        Map<String, Object> map = new HashMap();
        for(Iterator it = ((AbstractEnvironment) env).getPropertySources().iterator(); it.hasNext(); ) {
            PropertySource propertySource = (PropertySource) it.next();
            if (propertySource instanceof MapPropertySource) {
                map.putAll(((MapPropertySource) propertySource).getSource());
            }
        }
        ...
    }
...

基本的に、環境からすべて MapPropertySource である環境 (そして非常に多くの実装があります) からは、すべて Map のプロパティとしてアクセスできます。