Spring Boot: leia a lista do yaml usando @Value ou @ConfigurationProperties
Eu quero ler uma lista de hosts de um arquivo yaml (application.yml), o arquivo fica assim:
cors:
hosts:
allow:
- http://foo1/
- http://foo2/
- http://foo3/
(Exemplo 1)
Minha classe usada define o valor assim:
@Value("${cors.hosts.allow}")
List<String> allowedHosts;
Mas a leitura falha quando o Spring reclama disso:
java.lang.IllegalArgumentException: não foi possível resolver o espaço reservado 'cors.hosts.allow' no valor da sequência "$ {cors.hosts.allow}"
Quando altero o arquivo assim, a propriedade pode ser lida, mas naturalmente ela não contém a lista, mas apenas uma entrada:
cors:
hosts:
allow: http://foo1, http://foo2, http://foo3
(Eu sei que eu poderia ler os valores como uma única linha e dividi-los por","
mas ainda não quero uma solução alternativa)
Isso também não funciona (embora eu ache que isso deve ser válido de acordo comsnakeyamls docs):
cors:
hosts:
allow: !!seq [ "http://foo1", "http://foo2" ]
(Ignorando o!!seq
e apenas usando o[
/ ]
também é um fracasso)
Eu li a sugestãoaqui que envolve o uso@ConfigurationProperties
e transferiu o exemplo para Java e o usou com o arquivo yaml que você vê no Exemplo1:
@Configuration
@EnableWebMvc
@ConfigurationProperties(prefix = "cors.hosts")
public class CorsConfiguration extends WebMvcConfigurerAdapter {
@NotNull
public List<String> allow;
...
Quando executo isso, recebo esta reclamação:
org.springframework.validation.BindException: org.springframework.boot.bind.RelaxedDataBinder $ RelaxedBeanPropertyBindingResult: 1 erros Erro de campo no objeto 'cors.hosts' no campo 'allow': valor rejeitado [null]; códigos [NotNull.cors.hosts.allow, NotNull.allow, NotNull]; argumentos [org.springframework.context.support.DefaultMessageSourceResolvable: codes [cors.hosts.allow, allow]; argumen ts []; mensagem padrão [permitir]];
Procurei por outros meios para ter meus hosts CORS configuráveis e achei issoProblema com o Spring Boot mas como isso ainda não terminou, não posso usá-lo como solução. Tudo isso é feito com o Spring Boot 1.3 RC1