6
respostas

Acessar config no application.properties

Boa tarde pessoal, Tenho uma aplicação maven com spring boot, estou tentando usar nas classes as configurações do meu application.properties está na /src/main/resources, não consigo de forma alguma acessar as configurações nele.

Tentei uma classe com as annotations: @Configuration e @PropertySource("classpath:application.properties")

Tento a injeção do @Autowired Environment env; que sempre fica NULO. Também tentei acessar diretamente uma configuração, tb sem sucesso via @Value: @Value("${services.spotify.token.uri}") public String tokenUri;

Por favor alguém sabe me dizer, ou tem alguma ideia da razão de só retornar nulo? ou alguma outra forma de acessar as configurações no application.properties ??

abs e obrigado!

6 respostas

Oi Oscar,

Estranho não ter funcionado, pois o código é esse mesmo.

Possíveis possibilidades:

  1. A variável que você está injetado a propriedade é final
  2. A variável que você está injetado a propriedade é static
  3. A classe onde você está injetando não é um componente do Spring

Verifique se não é alguma dessas situações no seu projeto.

Obrigado Rodrigo pela rápida resposta. Criei uma classe com as anotações pra obter as configurações do application.properties, porém nem nela nem em outras consigo injetar o Environment pra ler a config. Este outro método que pesquisei, usando o @Value, tb não devolve nada nesta e nas outras classes.

Alguma outra idéia por favor ??

@Configuration
@PropertySource("classpath:application.properties")
public class AppProperties {
    @Value("${services.spotify.token.uri}")
    public String tokenUri;

    @Autowired
    Environment env;

    public AppProperties() {
        if (env == null) System.out.println("** Environment not yet Inject  ");
        if (tokenUri == null) System.out.println("** Cant read from application.properties yet  ");
    }
}

Pois é, estranho não ter funcionado.

Qual a versão do Spring Boot no teu projeto?

Tenta fazer assim também:

@ConfigurationProperties(prefix = "services.spotify.token")
public class AppProperties {

    private String uri;

    public AppProperties() {
        if (uri == null) System.out.println("** Cant read from application.properties yet  ");
    }

    public String getUri() {
        return this.uri;
    }

    public void setUri(String uri) {
        this.uri = uri;
    }
}

E na classe main, que está anotada com @SpringBootApplication, adicione nela também a anotação @EnableConfigurationProperties(AppProperties.class)

Ah, outra coisa, agora que vi que você está tentando acessar a propriedade injetada diretamente no construtor da classe.

O Spring apenas injeta as propriedades após passar pelo construtor.

Veja se assim ele lê então:

@PostConstruct
public void read() {
    if (uri == null) System.out.println("** Cant read from application.properties yet  ");
}

O método anotado com @PostConstruct é chamado após a injeção de dependências.

Estou usando o 2.2.2.RELEASE.

Infelizmente não funcionou mesmo com @PostConstruct e fora do construtor.

Tem outro detalhe, estou fazendo todas essas tentativas e chamadas em um teste unitario JUnit, mas usando as annotations e chamando a classe AppProperties

Ah entendi.

Talvez na classe de testes tenha que configurar mais coisas mesmo, para ele conseguir injetar.

Dá uma olhada nesse tutorial e tenta fazer similar no seu código para ver se funciona: https://www.baeldung.com/spring-test-property-source