私は以下のような構成のクラスを持っています。内部クラスのすべてのフィールドを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")
基づいて@M。Deinumのアドバイスは、コンフィギュレーション・クラスにいくつかの変更を行いました。私は春の初心者です、私が春舞台裏どのように機能するか誤解を持っているようです。
- まず、私はすべて削除
@Value
内部クラス(すなわちから注釈OptionalServiceConfigs
)、および同様service
のフィールドをMyConfigs
クラス。 - 次に、そのデフォルト値をインラインで、すべての内部クラスのフィールドを初期化します。
- コンストラクタで
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
}