Le variables di ambiente e @Value non possono lavorare insieme su Spring Boot

Ho un'appuntamento di avvio di Spring che si connette a un'istanza di Redis che funziona come una cache. Quando sono in ambiente dev, ho le seguenti:

--- spring: profiles: default redis: host: localhost port: 6379 

E la mia class di configuration della cache è così:

 @Configuration @EnableCaching public class CacheConfiguration { @Value("${redis.host}") String redisHost; @Value("${redis.port}") int redisPort; 

Nella produzione, questa applicazione è Dockerized e ho il seguente file docker-compose.yml :

 redis: image: tutum/redis ports: - "6379:6379" volumes: - /data app: build: . ports: - "8080:8080" links: - redis 

E l' application.yml è:

 --- spring: profiles: docker redis: host: redis port: 6379 

Per avviare l'applicazione su Docker, -Dspring.profiles.active=docker con -Dspring.profiles.active=docker , ma quando l'applicazione è in fase di avvio, si verifica il seguente errore:

 Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private int com.inkdrop.config.cache.CacheConfiguration.redisPort; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert value of type [java.lang.String] to required type [int]; nested exception is java.lang.NumberFormatException: For input string: "tcp://172.17.0.3:6379" 

Per qualche motivo, Spring Boot sta leggendo la redis.port come tcp://172.17.0.3:6379 . Quindi, per i test, ho rimosso le annotazioni @Value dalla class CacheConfiguration e impostato manualmente a redis come host e 6379 come port e ha funzionato. Sembra che quando si utilizzano variables di ambiente e @Value , Spring si perde. Chiunque ha un'idea?

Sulla base della documentazione Docker :

Il comporre usa i collegamenti Docker per esporre i contenitori dei servizi a vicenda. Ogni contenitore collegato inietta un insieme di variables di ambiente, ognuna delle quali inizia con il nome maiuscolo del contenitore .

Docker Compose crea una variabile di ambiente che rappresenta l' URL completo del contenitore utilizzando il formato name_PORT , ad esempio REDIS_PORT=tcp://172.17.0.5:6379 .

E basato sul file docker-compose.yml :

 redis: image: tutum/redis ports: - "6379:6379" volumes: - /data 

Avresti una variabile di ambiente denominata REDIS_PORT con un valore pari a tcp://172.17.0.3:6379 le variables di ambiente del sistema operativo hanno più precedenza rispetto alle properties; dell'applicazione specifiche del profilo, Spring Boot avrebbe ricevuto il valore redis.port su redis.port , quindi l'errore:

Causa: org.springframework.beans.factory.BeanCreationException: Imansible aprire il field autowire: int int com.inkdrop.config.cache.CacheConfiguration.redisPort; l'exception nidificata è org.springframework.beans.TypeMismatchException: Imansible convertire il valore di tipo [java.lang.String] nel tipo richiesto [int]; l'exception nidificata è java.lang.NumberFormatException: per la string di input: "tcp: //172.17.0.3: 6379"

Come soluzione per questo problema, è necessario ignorare la variabile di ambiente REDIS_PORT con il valore di port o rinominare il nome di config da redis.name a qualsiasi cosa less controversa.

Kinda fuori argomento, ma solo citando da tutum-docker-redis di tutum-docker-redis Github :

Questa image sarà deprecata presto. Utilizza l'image ufficiale dell'addetto: https://hub.docker.com/_/redis/