春ブーツはapplication.propertiesには対応するネストされたキー/値のペアが存在しないとき、結合、ネストされたコンフィギュレーションのための新しいインスタンスを初期化します

isuru89 :

私は以下のような構成のクラスを持っています。内部クラスのすべてのフィールドをOptionalServiceConfigs使用して注釈を付けて、デフォルト値を持っている@Value以下のように。

時には、私の中application.propertiesのファイル、それはしない単一持つservice接頭辞プロパティを。その場合には、我々は、読み込まれているしたいOptionalServiceConfigsデフォルトのフィールド値でインスタンスを。

@Configuration
@ConfigurationProperties(prefix = "myconf")
public class MyConfigs {

   // ... rest of my configs

   @Value("${service:?????}") // what to put here, or can I?
   private OptionalServiceConfigs service;   // this is null

   // In this class all fields have a default value.
   public static class OptionalServiceConfigs {

       @Value("${mode:local}")
       private String mode;

       @Value("${timeout:30000}")
       private long timeout;

       // ... rest of getter and setters
   }

   // ... rest of getter and setters
}

しかし残念ながら、serviceフィールドがありnull、それがそのgetterメソッドを使用してアクセスされたとき。春ブーツがあるのでしない、それのインスタンスを初期化する接頭辞で見つかりませプロパティキーが存在しないときmyconf.service.*、私の中でapplication.propertiesファイル。

質問:

どのようにして作ることができますserviceプロパティファイルには、対応する接頭辞付きのキーが存在しない場合、フィールドは、その指定されたデフォルトのフィールド値と共に新しいインスタンスに初期化するために?

私は、注釈に入れる価値は想像できない@Value("${service:?????}")ためservice、フィールドを。何もしようとした作品、@Value("${service:}")または@Value("${service:new")

isuru89 :

基づいて@M。Deinumのアドバイスは、コンフィギュレーション・クラスにいくつかの変更を行いました。私は春の初心者です、私が春舞台裏どのように機能するか誤解を持っているようです。

  1. まず、私はすべて削除@Value内部クラス(すなわちから注釈OptionalServiceConfigs)、および同様serviceのフィールドをMyConfigsクラス。
  2. 次に、そのデフォルト値をインラインで、すべての内部クラスのフィールドを初期化します。
  3. コンストラクタでMyConfigs、私はの新しいインスタンスを初期化OptionalServiceConfigsフィールドにservice

これにより、存在しない時はいつでも service私の関連のキーapplication.propertiesの新しいインスタンスがすでにデフォルト値で作成されています。

ある場合/あるservice関連キー/ sの、そして春はで指定された値に私のデフォルト値を上書きしないapplication.properties 唯一のフィールド(複数可)、私が指定しました。

私はそれが参照するフィールド(すなわちことを事前に知ることができる方法はありませんことを春の観点から信じているserviceフィールドが)そのキーのいずれも設定ファイルに存在しない構成に関連されるだろう。それは、春には、それを初期化しない理由でなければなりません。けっこうだ。

完全なソリューション:

@Configuration
@ConfigurationProperties(prefix = "myconf")
public class MyConfigs {

   // ... rest of my configs

   private OptionalServiceConfigs service;

   public static class OptionalServiceConfigs {

       private String mode = "local";

       private long timeout = 30000L;

       // ... rest of getter and setters
   }

   public MyConfigs() {
      service = new OptionalServiceConfigs();
   }

   // ... rest of getter and setters
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=215399&siteId=1