38

さまざまなプロファイルでアクティブなプロパティを示す単一のファイルがあると非常に読みやすく、便利だと思うので、Spring Boot に YAML 構成を使用したいと思います。残念ながら、プロパティの設定application.ymlはかなり脆弱であることがわかりました。

スペースの代わりにタブを使用すると、プロパティが存在しなくなり (私の知る限り、警告は表示されません)、YAML の不明な問題により、アクティブなプロファイルが設定されていないことがよくあります。

そのため、現在アクティブなプロファイルとプロパティを取得してログに記録できるようにするフックがあるかどうか疑問に思っていました。

同様に、エラーが含まれている場合に起動を失敗させる方法はありapplication.ymlますか? それか、YAML を自分で検証して、起動プロセスを強制終了できるようにする手段のいずれかです。

4

5 に答える 5

12

私も同じ問題を抱えていました。プロファイル処理システムに有用なログを吐き出すように指示するデバッグ フラグがあればいいのにと思います。考えられる方法の 1 つは、アプリケーション コンテキストのイベント リスナーを登録し、環境からプロファイルを出力することです。私は自分でこの方法を試したことがないので、マイレージは異なる場合があります。ここに概説されているもののようなものかもしれません:

アプリケーションコンテキストの初期化イベントにフックを追加するには?

次に、リスナーで次のようにします。

System.out.println("Active profiles: " + Arrays.toString(ctxt.getEnvironment().getActiveProfiles()));

試してみる価値があるかもしれません。おそらく実行できる別の方法は、プロファイルを出力する必要があるコードに挿入される環境を宣言することです。すなわち:

@Component
public class SomeClass {
  @Autowired
  private Environment env;
  ...
  private void dumpProfiles() {
    // Print whatever needed from env here
  }
}
于 2014-09-23T01:55:59.637 に答える
11

Actuator /env サービスはプロパティを表示しますが、実際にアクティブなプロパティ値は表示しません。非常に頻繁に、アプリケーションのプロパティをオーバーライドしたい場合があります。

  • プロファイル固有のアプリケーション プロパティ
  • コマンドライン引数
  • OS 環境変数

したがって、複数のソースで同じプロパティと異なる値を持つことになります。

以下のスニペットは、起動時にアクティブなアプリケーション プロパティの値を出力します。

@Configuration
public class PropertiesLogger {
    private static final Logger log = LoggerFactory.getLogger(PropertiesLogger.class);

    @Autowired
    private AbstractEnvironment environment;

    @PostConstruct
    public void printProperties() {

        log.info("**** APPLICATION PROPERTIES SOURCES ****");

        Set<String> properties = new TreeSet<>();
        for (PropertiesPropertySource p : findPropertiesPropertySources()) {
            log.info(p.toString());
            properties.addAll(Arrays.asList(p.getPropertyNames()));
        }

        log.info("**** APPLICATION PROPERTIES VALUES ****");
        print(properties);

    }

    private List<PropertiesPropertySource> findPropertiesPropertySources() {
        List<PropertiesPropertySource> propertiesPropertySources = new LinkedList<>();
        for (PropertySource<?> propertySource : environment.getPropertySources()) {
            if (propertySource instanceof PropertiesPropertySource) {
                propertiesPropertySources.add((PropertiesPropertySource) propertySource);
            }
        }
        return propertiesPropertySources;
    }

    private void print(Set<String> properties) {
        for (String propertyName : properties) {
            log.info("{}={}", propertyName, environment.getProperty(propertyName));
        }
    }

}
于 2016-05-23T13:49:51.270 に答える