Spring Cloud Config Serverは複数のプロファイルを受け入れ、アプリケーションの/ envエンドポイントにアクセスすると、すべてのプロファイルのプロパティを返します。応答には、各プロファイルに固有のプロパティが一覧表示されます。同じプロパティが2つの異なるプロパティファイルに存在する場合、最後に定義されたプロパティが優先されます。アプリケーションで使用されるプロパティキーと値の最終リストを取得する方法はありますか?
Cloud Configクライアントアプリケーションの場合
私はさまざまな方法を試しましたが、(誤って)以下を見つけました:
GET /env/.*
は、構成プロパティの完全なリストを返します
Cloud Configサーバーアプリケーションの場合
これはすでに実装されていますが、十分に文書化されていません。必要なのは、パターンに従ってjson
、yml
またはproperties
をリクエストすることだけです。
/{application}-{profile}.{ext}
/{label}/{application}-{profile}.{ext}
import Java.util.properties;
import org.springframework.core.env.AbstractEnvironment;
import org.springframework.core.env.CompositePropertySource;
import org.springframework.core.env.Environment;
public class MyClass {
@Autowired
private Environment env;
Properties getProperties() {
Properties props = new Properties();
CompositePropertySource bootstrapProperties = (CompositePropertySource) ((AbstractEnvironment) env).getPropertySources().get("bootstrapProperties");
for (String propertyName : bootstrapProperties.getPropertyNames()) {
props.put(propertyName, bootstrapProperties.getProperty(propertyName));
}
return props;
}
}
申し訳ありません。ここで質問に初めて答えます。同じ問題を調査しているときに出くわしたので、この質問に答えるために特別にアカウントを作成しました。私に役立つ解決策を見つけ、それを共有することにしました。
これが何が行われたかについての私の説明です:
新しい "Properties"オブジェクトを初期化します(HashMapまたはその他の必要なものにすることができます)
CompositePropertySourceオブジェクトである「bootstrapProperties」のプロパティソースを検索します。このプロパティソースには、読み込まれたすべてのアプリケーションプロパティが含まれています。
CompositePropertySourceオブジェクトの「getPropertyNames」メソッドから返されたすべてのプロパティ名をループして、新しいプロパティエントリを作成します。
プロパティオブジェクトを返します。
これは、Spring Frameworkの意図的な制限のようです。
こちら を参照
それをハックしてPropertySourcesインターフェイスを挿入し、個々のすべてのPropertySourceオブジェクトをループ処理することもできますが、探しているプロパティを知る必要があります。
Spring Bootを使用すると、構成を外部化できるため、異なる環境で同じアプリケーションコードを使用できます。プロパティファイル、YAMLファイル、環境変数、コマンドライン引数を使用して、構成を外部化できます。プロパティ値は、@ Valueアノテーションを使用して直接Beanに注入できます。これは、Springの環境抽象化を介してアクセスするか、@ ConfigurationPropertiesを介して構造化オブジェクトにバインドします。
Spring Bootは、値を適切に上書きできるように設計された非常に特殊なPropertySource順序を使用します。 プロパティは次の順序で考慮されます:
以下のプログラムは、春のブート環境からプロパティを出力します。
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ApplicationObjectSupport;
import org.springframework.core.env.Environment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource;
import org.springframework.stereotype.Component;
import org.springframework.web.context.support.StandardServletEnvironment;
@Component
public class EnvironmentLogger extends ApplicationObjectSupport {
@Override
protected void initApplicationContext(ApplicationContext context) throws BeansException {
Environment environment = context.getEnvironment();
String[] profiles = environment.getActiveProfiles();
if(profiles != null && profiles.length > 0) {
for (String profile : profiles) {
System.out.print(profile);
}
} else {
System.out.println("Setting default profile");
}
//Print the profile properties
if(environment != null && environment instanceof StandardServletEnvironment) {
StandardServletEnvironment env = (StandardServletEnvironment)environment;
MutablePropertySources mutablePropertySources = env.getPropertySources();
if(mutablePropertySources != null) {
for (PropertySource<?> propertySource : mutablePropertySources) {
if(propertySource instanceof MapPropertySource) {
MapPropertySource mapPropertySource = (MapPropertySource)propertySource;
if(mapPropertySource.getPropertyNames() != null) {
System.out.println(propertySource.getName());
String[] propertyNames = mapPropertySource.getPropertyNames();
for (String propertyName : propertyNames) {
Object val = mapPropertySource.getProperty(propertyName);
System.out.print(propertyName);
System.out.print(" = " + val);
}
}
}
}
}
}
}
}