春のConfigurationPropertiesサブクラスのコンストラクタインジェクションを使用します

アーサー:

私はこれを見ていた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);
    }
}

おすすめ

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