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}"
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.
values
não é uma propriedade do ambiente da Primavera, mas my-config.values
é.
Mesmo declarado dentro MyConfig
, como @Value("${values})"
isso não muda nada como @ConfigurationProperties
limites 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 @Value
deve 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);
}
}