2016-05-08 6 views
2

キャッシュとして動作するRedisインスタンスに接続するSpring起動アプリケーションがあります。私はDEV環境にいるとき、私は次のようにあります環境変数と@ValueはSpring起動時には同時に動作しません

--- 

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

そして、私のキャッシュ構成クラスは、このようなものです:

製造において
@Configuration 
@EnableCaching 
public class CacheConfiguration { 

    @Value("${redis.host}") 
    String redisHost; 

    @Value("${redis.port}") 
    int redisPort; 

、このアプリはDockerizedある、と私はdocker-compose.ymlを以下していますファイル:

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

そしてapplication.ymlです:

--- 

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

ドッカー上のアプリを起動するには、私は-Dspring.profiles.active=dockerで実行されますが、アプリが起動されると、次のエラーが起こる:

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" 

何らかの理由で、春ブーツはtcp://172.17.0.3:6379としてredis.portを読んでいます。そこでテストの提案では、CacheConfigurationクラスの@Value注釈を削除し、手動でredisをホストに、6379をポートとして設定しました。環境変数と@Valueを使用しているときのように、Springは紛失します。誰でもアイデアはありますか? name_PORTフォーマットを使用して、容器、例えばの完全URLを表す環境変数を作成し

Compose uses Docker links to expose services containers to one another. Each linked container injects a set of environment variables, each of which begins with the uppercase name of the container.

ドッカー作曲:Docker documentationに基づい

+2

あなたはどの春ブートバージョンを使用していますか?また、私はドッカーの作成ファイル自体に環境変数を設定しようとします: 'environment:redis.port = 6379'、何が起こるか見てください。 –

+0

1.3.4を使用しています。私はそれを試してみます –

答えて

3

REDIS_PORT=tcp://172.17.0.5:6379

そして、あなたのdocker-compose.ymlファイルに基づいて:

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

あなたはtcp://172.17.0.3:6379 .Since OSの環境変数は、プロファイル固有するアプリケーションプロパティをに関してより優先されている値でREDIS_PORTという環境変数に等しいだろう、春この問題は、あなたのいずれかの笙のための回避策として

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"

:ブートは、redis.port上ので、エラーをREDIS_PORT値を拾うでしょうuldあなたのポートの値でREDIS_PORT環境変数を上書きするか、redis.nameからの設定名をあまり議論の余地がないものに変更してください。

ちょっとオフトピックちょうどtutum-docker-redisGithub repositoryからの引用:

This image will be deprecated soon. Please use the docker official image: https://hub.docker.com/_/redis/

+1

私は今devのコンピュータではない、私は後でそれを試してみます。今のところ、何が起こったのか正確に考えています。私は今この答えを受け入れるでしょう:D –

+0

ok ..楽しんでください。 :)) –

関連する問題