Use injeção de construtor para ConfigurationProperties primavera subclasses

Arthur :

Eu estava olhando para este https://www.baeldung.com/configuration-properties-in-spring-boot e queria saber se era possível utilizar a injeção de construtor para estes, a fim de cumprir algumas propriedades imutabilidade.

Por exemplo seria possível fazer isso:

@Component
@ConfigurationProperties("my-config")
public class MyConfig {

    private final List<String> values;

    public MyConfig(@Value("${values}") List<String> values) {
        this.values = ImmutableList.copyOf(values);
    }
}

E então no meu yml configuração Tem

my-config.values:
  - foo
  - bar

Mas eu recebo este erro:

java.lang.IllegalArgumentException: Could not resolve placeholder 'values' in string value "${values}"
davidxxx:

Os documentação estados:

Os valores de propriedade pode ser injetado diretamente em seus feijões usando a anotação @value, acessado através da abstração do Meio Ambiente da Primavera, ou ser vinculado a objetos estruturados através @ConfigurationProperties. :

Você realmente tentar misturar seu comportamento.
valuesnão é uma propriedade do ambiente da Primavera, mas my-config.valuesé.
Mesmo declarado dentro MyConfig, como @Value("${values})"isso não muda nada como @ConfigurationPropertieslimites as propriedades a um objeto estruturado. E, claro, ele não cria novas propriedades no ambiente de Primavera, que é onde @Value()olhares para resolver a expressão de valor.
Considerando que a exceção para resolver ${values}.

Como MyConfigé um componente @Valuedeve ser o que você precisa:

@Component
public class MyConfig {

    private final List<String> values;

    public MyConfig(@Value("${my-config.values}") List<String> values) {
        this.values = ImmutableList.copyOf(values);
    }
}

Você também pode impedir a mutabilidade protegendo o setter com um cheque, mas isso vai detectar o problema apenas em tempo de execução:

@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);
    }
}

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=190208&siteId=1
Recomendado
Clasificación