2016-09-05 11 views
1

実行中のSpring(起動)アプリケーションのすべてのプロパティプレースホルダとその解決された値をプロセス監視に使用したいと思います。最初のステップでは、ログに書き込むか、application.pidファイルに似た 'resolved.properties'ファイルを作成するだけです。 プロパティプレースホルダが使用されるすべてのプロパティ(暗黙的または明示的)を考慮する必要があります。Springプロパティのプレースホルダとその解決された値のリストを取得

動機:解決されたプロパティの値を知ることは、操作中に通常は困難です。システムプロパティまたはコマンドライン引数は「可視」ですが、コード内の非表示のデフォルト値(@Value("${timeout:30000}")など)はわかりにくいです。私は "実行中のアプリケーションの設定はどのように見えるのですか?"という質問に答えることができるようにしたいと思います。一般的な方法で私は私の春のアプリケーションのすべてで使用することができます。

私はスプリングブート・アクチュエータ/ configpropsエンドポイントについて知っていますが、これには@ConfigurationPropertiesしか含まれていません。プレースホルダが使われているすべてのプロパティのリストを取得したいと思います。

要件は新規ではないようです(hereまたはhereを参照)が、今日は適切な(手ごわい)方法があるのだろうかと思います。

+0

ありません。現在、プロパティのすべての値をすべてのプロパティソースに渡って一覧表示する方法はありません。たとえば、実行時にプロパティが変更される可能性があるため、何も追加しないSpring Cloud Configの場合も同様です。 –

+0

@M。 Deinumありがとう。実行時に設定が変わらないので、何も追加しないとは思わない。この機能は 'configprops'エンドポイントで提供されますが、' @ ConfigurationProperties'に限られています。この制限がなくなり、Springがすべてのプレースホルダとその(現在の)値へのアクセスを提供するなら、それは素晴らしいことでしょう。 – FrVaBe

+0

プレースホルダのリストはなく、 'PropertySources'抽象化はそのようなことを提供しません。私はそれが偉大ではないと言っているわけではありませんが、現在はありません... –

答えて

2

Environment抽象で​​すべてのプロパティを取得する方法は、(現在は)ありません。これは意図的なもので、hereと読むことができます。これはまた、解決に使用されるすべての値を得ることができない理由です。

実行時に、どのキーが解決されたかを示す値と解像度がログに記録されます。しかし、そのログは非常に冗長であり、StringValueResolverが使用されるたびに記録されます。

解決済みのキーと値のペアのコレクションを保持する独自のカスタマイズPropertySourcesPlaceholderConfigurerを提供することで、部分的な結果が得られる場合があります。しかし、すべての解像度がPropertySourcesPlaceholderConfigurerを使用する場合は、PropertySourcesPlaceholderConfigurerをバイパスしてStringValueResolverの実装を直接使用するものもあります。

+0

ありがとう - 特に、背景情報への非常に便利なリンクです。 @Phil Webbから提供されるソリューションは、デフォルト値の宣言を持つプロパティを除いて、私が探している情報をカバーするようです。 – FrVaBe

+0

問題はすべてのプロパティを取得することです。したがって、もしあなたの 'application.properties'に一つのプロパティが定義されていて、システムやコマンドラインのプロパティとして二つの値が得られれば、どちらが実際に使われているのか分からないでしょう。 'application- .properties'にも同じことが適用され、' application.properties'からのものと上書きされたものの両方が表示されます。 –

+0

非常に有用なヒント。 Springがこのユースケースでは難しいことを驚かせています。 – FrVaBe

0

あなたのすべてのニーズをカバーしているわけではありません(すべてのファイルのプロパティ、デフォルト値、アプリケーション引数など)。 私はまだ他の読者のための答えを保持しています。

春ブーツのアクチュエーター/envエンドポイント

あなたは/envエンドポイントを使用することができます。これは、原料の束を示していますが、それはまた、(近端)application.propertiesの内容が含まれています

applicationConfig: [classpath:/application.properties]={myproperty=blah, server.port=8080} 
+0

ありがとうございます。残念ながら、これはすべての場所(すべてのファイル、デフォルト値、アプリケーション引数など)からのプロパティをリストしていません。 – FrVaBe

+0

ああ、私はすべてをカバーするわけではないと答えを更新しますが、将来の参照のために残しておきます – alexbt

関連する問題