web-dev-qa-db-ja.com

プロパティの最終リストを一覧表示-Spring Cloud Config Server

Spring Cloud Config Serverは複数のプロファイルを受け入れ、アプリケーションの/ envエンドポイントにアクセスすると、すべてのプロファイルのプロパティを返します。応答には、各プロファイルに固有のプロパティが一覧表示されます。同じプロパティが2つの異なるプロパティファイルに存在する場合、最後に定義されたプロパティが優先されます。アプリケーションで使用されるプロパティキーと値の最終リストを取得する方法はありますか?

12
Punter Vicky

Cloud Configクライアントアプリケーションの場合

私はさまざまな方法を試しましたが、(誤って)以下を見つけました:

GET /env/.*は、構成プロパティの完全なリストを返します

Cloud Configサーバーアプリケーションの場合

これはすでに実装されていますが、十分に文書化されていません。必要なのは、パターンに従ってjsonymlまたはpropertiesをリクエストすることだけです。

/{application}-{profile}.{ext}
/{label}/{application}-{profile}.{ext}
8
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;
  }

}

申し訳ありません。ここで質問に初めて答えます。同じ問題を調査しているときに出くわしたので、この質問に答えるために特別にアカウントを作成しました。私に役立つ解決策を見つけ、それを共有することにしました。

これが何が行われたかについての私の説明です:

  1. 新しい "Properties"オブジェクトを初期化します(HashMapまたはその他の必要なものにすることができます)

  2. CompositePropertySourceオブジェクトである「bootstrapProperties」のプロパティソースを検索します。このプロパティソースには、読み込まれたすべてのアプリケーションプロパティが含まれています。

  3. CompositePropertySourceオブジェクトの「getPropertyNames」メソッドから返されたすべてのプロパティ名をループして、新しいプロパティエントリを作成します。

  4. プロパティオブジェクトを返します。

6
Todd Jones

これは、Spring Frameworkの意図的な制限のようです。

こちら を参照

それをハックしてPropertySourcesインターフェイスを挿入し、個々のすべてのPropertySourceオブジェクトをループ処理することもできますが、探しているプロパティを知る必要があります。

3
dardo
  1. 外部設定

Spring Bootを使用すると、構成を外部化できるため、異なる環境で同じアプリケーションコードを使用できます。プロパティファイル、YAMLファイル、環境変数、コマンドライン引数を使用して、構成を外部化できます。プロパティ値は、@ Valueアノテーションを使用して直接Beanに注入できます。これは、Springの環境抽象化を介してアクセスするか、@ ConfigurationPropertiesを介して構造化オブジェクトにバインドします。

Spring Bootは、値を適切に上書きできるように設計された非常に特殊なPropertySource順序を使用します。 プロパティは次の順序で考慮されます:

  • ホームディレクトリのDevtoolsグローバル設定プロパティ(devtoolsがアクティブな場合は〜/ .spring-boot-devtools.properties)。
  • テストの@TestPropertySourceアノテーション。
  • テストの@ SpringBootTest#propertiesアノテーション属性。
  • コマンドライン引数。
  • SPRING_APPLICATION_JSONからのプロパティ(環境変数またはシステムプロパティに埋め込まれたインラインJSON)
  • ServletConfig initパラメータ。
  • ServletContextの初期化パラメータ。
  • Java:comp/envのJNDI属性。
  • Javaシステムプロパティ(System.getProperties())。
  • OS環境変数。
  • Random。*内のプロパティのみを持つRandomValuePropertySource。
  • パッケージ化されたjar外のプロファイル固有のアプリケーションプロパティ(application- {profile} .propertiesおよびYAMLバリアント)
  • Jar内にパッケージ化されたプロファイル固有のアプリケーションプロパティ(application- {profile} .propertiesおよびYAMLバリアント)
  • パッケージ化されたjar外のアプリケーションプロパティ(application.propertiesおよびYAMLバリアント)。
  • Jar内にパッケージ化されたアプリケーションプロパティ(application.propertiesおよびYAMLバリアント)。
  • @Configurationクラスの@PropertySourceアノテーション。
  • デフォルトプロパティ(SpringApplication.setDefaultPropertiesを使用して指定)。

以下のプログラムは、春のブート環境からプロパティを出力します。

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);
                            }
                        }
                    }
                }
            }
        }
    }
}
3
Sudhakar