Проект SpringBoot, переменная среды в application.yml всегда пуста - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь запустить проект SpringBoot, который работает с docker-compose.я начал его зависимости (Redis, MongoDB и RabbitMQ) с docker-compose up

и собираю проект и запускаю его с помощью этих команд mvn clean package -DskipTests && mvn spring-boot:run

У меня по-прежнему возникают следующие ошибки:

Error processing condition on org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2RestOp erationsConfiguration$RequestScopedConfiguration

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'OAUTH_CLIENTID' in value "${OAUTH_CLIENTID}"

В файле docker-compose значения переменных среды определены в разделе среды.

 environment:
      - RABBIT_HOST=rabbitstomp
      - RABBIT_USER=guest
      - RABBIT_PASS=user
      - MONGO_HOST=mongodb://localhost:27017
      - OAUTH_CLIENTID=nz-kek
      - OAUTH_CLIENT_SECRET=DzXZxeOZOJHFZIUhObSpsne
      - SSO_HOST=https://webweb.com
      - CORS_HOSTS=HOST1,HOST2
      - SES_HOST=ses
      - SES_PORT=6000
      - REDIS_HOST=localhost
      - REDIS_PORT=6379 

Вот так выглядит application.yml:

     spring.data.mongodb:
  database: ${DB_NAME} #notificationdb
  uri: ${MONGO_HOST}
security:
  oauth2:
    resource:
      jwk:
        key-set-uri: ${auth-server:${SSO_HOST}}/keys
      token-info-uri: ${auth-server:${SSO_HOST}}/userinfo
    client:
      client-id: ${OAUTH_CLIENTID}
          client-secret: ${OAUTH_CLIENT_SECRET}` 

Поэтому, когда я запускаю проект без docker-compose, я должен поместить значения в application.yml?

я также пытался mvn spring-boot:run -Dspring-boot.run.arguments=--path.to.value=value1, но я не уверен, как путь должен быть с переменными, такими как key-set-uri: ${auth-server:${SSO_HOST}}/keys

Ответы [ 2 ]

1 голос
/ 14 июня 2019

Spring поддерживает предоставление значений по умолчанию в конфигурации через PlaceholderConfigurerSupport .Значением по умолчанию является то, что следует после :.В вашем случае вы должны написать:

client-id: ${OAUTH_CLIENTID:yourDevelopmentDefaultClientID}

Если вы используете аннотацию @Value для ввода значений, у вас есть поддержка SpEL для использования выражений типа: #{someExpression} для более сложных случаев.

ОБНОВЛЕНИЕ:

В вашем случае, я полагаю, вы меняете положение переменных.Правильно должно быть:

key-set-uri: ${SSO_HOST:auth-server}/keys

Вот что это означает: сначала он попытается использовать переменную окружения SSO_HOST, которая предоставляется контейнеру через docker-compose.Если эта переменная не предоставлена ​​процессу, Spring будет использовать auth-server в качестве адреса сервера.Мне кажется, что этот адрес виден только внутри сети docker-compose, поэтому, если вы запускаете свое приложение вне этой сети, адрес auth-server не будет виден.Вы знаете, где находится сервер аутентификации?Это еще один докер-контейнер?Это работает на локальном хосте?

Некоторые интересные ссылки: https://www.baeldung.com/spring-value-defaults

0 голосов
/ 14 июня 2019

Передать переменные env в Docker, составить как объект, а не список:

environment:
  RABBIT_HOST: rabbitstomp
  RABBIT_USER: guest
  RABBIT_PASS: user
  MONGO_HOST: mongodb://localhost:27017
  OAUTH_CLIENTID: nz-kek
  OAUTH_CLIENT_SECRET: DzXZxeOZOJHFZIUhObSpsne
  SSO_HOST: https://webweb.com
  CORS_HOSTS: HOST1,HOST2
  SES_HOST: ses
  SES_PORT: 6000
  REDIS_HOST: localhost
  REDIS_PORT: 6379` 
...