web-dev-qa-db-ja.com

構成プロパティに2つのyamlファイルを使用する

プロパティはapplication.ymlにあるapplication.propertiesではなくsrc/main/resources/ファイルから読み込まれるスプリングブートアプリケーションを使用しています。

config: 
  Host: localhost:8080  
  server: 123  

そして、彼らはこのような.Javaファイルに引っ張られています

@ConfigurationProperties( prefix="config")  
public class ConnectionImpl implements Connection{
  @Value("${config.Host}")
  private Stringhost;
} 

この方法でプロパティを取得できます。ただし、設定プロパティをapplication.ymlから別の場所にある別の.ymlファイルに移動しようとしています。 (src/main/resources/env-config)。
現在、同じ方法で、つまり@Valueアノテーションを使用してプロパティを取得できません。追加する必要がある他の注釈はありますか?

11
user2296988

ドキュメント から:

SpringApplicationは、次の場所にあるapplication.properties(またはapplication.yml)ファイルからプロパティをロードし、Spring Environmentに追加します。

  1. 現在のディレクトリの/configサブディレクトリ。
  2. 現在のディレクトリ
  3. クラスパス/configパッケージ
  4. クラスパスルート

構成ファイル名としてapplication.propertiesを使用したくない場合は、spring.config.name環境プロパティを指定して別の名前に切り替えることができます。 spring.config.location環境プロパティ(ディレクトリの場所またはファイルパスのカンマ区切りリスト)を使用して、明示的な場所を参照することもできます。

classpath:,classpath:/config,file:,file:config/の値に関係なく、デフォルトの検索パスspring.config.locationが常に使用されます。この検索パスは、優先順位の低いものから高いものへと並べられています(file:config/優先)。独自の場所を指定する場合、それらはすべてのデフォルトの場所よりも優先され、同じ最低から最高の優先順位を使用します。このようにして、アプリケーションのデフォルト値をapplication.properties(またはspring.config.nameで選択した他のベース名)に設定し、デフォルトを保持しながら、実行時に別のファイルでオーバーライドできます。

SpringApplicationに具体的に調べる場所を指示するコマンドライン引数を指定する必要があります。 resources/のすべてがクラスパスのルートに追加されると、コマンドラインは次のようになります。

Java -jar myproject.jar --Dspring.config.location=classpath:/env-config/service-config.yml

application.ymlの下に一般的なresources/がある場合、その中のプロパティは引き続き読み込まれますが、コマンドラインで指定されたプロパティファイルよりも優先されます。

9
su45

あなたの質問はあなたが何をするつもりなのかを実際に言っていませんが、異なる環境(例えばdevelopmenttestproduction)に異なる設定をしたい場合は、そのための簡単なソリューションです。

プロジェクト内の次のようなファイル階層に構成ファイルを配置します。

src/
  main/
    resources/
      application.yml
      application-development.yml
      application-test.yml
      application-production.yml

アプリケーションを起動すると

Java -jar mySpringApplication.jar -Dspring.profiles.active=development

application.ymlの設定は「ベースレイヤー」として扱われ、application-development.ymlの設定によって上書きされます。これにより、application.ymlのすべての環境に「デフォルト」設定を、application-ENV.ymlファイルに環境固有の構成を設定できます。同じことがtestproductionでも機能します。

6
Michael Lihs

番号。

コードベース内でそのようなファイルパスをハードコーディングしないようにすると、はるかに良い位置になります。 @ConfigurationPropertiesには以前はlocations属性がありましたが、1.5で廃止され、すでに削除されています。

Spring Bootでは、Environmentを構成します。これは、構成の唯一の信頼できる情報源です。コードに設定を埋め込むのではなく、必要なファイルを読み取るようにSpring Bootを構成する必要があります。 spring.config.location 。これをより透過的な方法で実行したい場合は、おそらく EnvironmentPostProcessorが必要です

3
Stephane Nicoll