アーサー:
私はこれを見ていたhttps://www.baeldung.com/configuration-properties-in-spring-boot、いくつかの不変性を強制するために、これらのコンストラクタインジェクションを使用することが可能であったならばと思いまして。
例えば、これを行うことが可能であろう。
@Component
@ConfigurationProperties("my-config")
public class MyConfig {
private final List<String> values;
public MyConfig(@Value("${values}") List<String> values) {
this.values = ImmutableList.copyOf(values);
}
}
そして、私のYMLコンフィグお持ち
my-config.values:
- foo
- bar
しかし、私はこのエラーを取得します:
java.lang.IllegalArgumentException: Could not resolve placeholder 'values' in string value "${values}"
davidxxx:
ドキュメントの状態:
プロパティの値は、Springの環境抽象化を介してアクセスする@value注釈を使用して、豆に直接注入することができ、または @ConfigurationPropertiesを通じて構造化オブジェクトにバインドされます。:
あなたは、実際に彼らの行動をミックスしてみてください。
values
春環境のプロパティではなくmy-config.values
です。
でも内で宣言MyConfig
ような@Value("${values})"
ことのように何も変更しない@ConfigurationProperties
構造化オブジェクトに境界プロパティを。そしてもちろん、それはそれ、春の環境で新しいプロパティを作成しない場合@Value()
値式を解決するためのルックス。
解決するには例外一方${values}
。
MyConfig
コンポーネントである@Value
あなたが必要なものでなければなりません。
@Component
public class MyConfig {
private final List<String> values;
public MyConfig(@Value("${my-config.values}") List<String> values) {
this.values = ImmutableList.copyOf(values);
}
}
あなたもチェックしてセッターを保護することにより、可変性を防ぐことができるが、これは実行時にのみ問題を検出します。
@ConfigurationProperties("my-config")
public class MyConfig {
private final List<String> values;
public List<String> getValue(){
return values;
}
public void setValue(List<String> values){
if (this.values != null){
throw new IllegalArgumentException("...");
}
this.values = ImmutableList.copyOf(values);
}
}