Свойства Spring-boot @Value не переопределяются аргументами командной строки - PullRequest
1 голос
/ 21 июня 2019

У меня есть приложение Maven / SpringBootApplication, которое берет свои свойства с сервера конфигурации Spring.Мне нужно переопределить значения этих свойств с помощью аргументов командной строки.к сожалению, свойства сохраняют значения, предоставленные сервером конфигурации, и не переопределяются аргументами командной строки.

  • Я подтвердил, что параметры должным образом передаются в приложение, как я вижу, передаются вSpringApplication.run.
  • Я могу видеть в функции ConfigurableApplicationContext Spring Framework среду, содержащую аргументы в environment.propertysources.propertySourceList.SimpleCommandLinePropertySource.source.optionArgs
  • Если я пытаюсь установить значение, определенное Spring (например --logging.level.org.springframework.web = TRACE) это работает, то есть следы журналов Spring

Я прочитал все возможные темы на эту тему, но, похоже, ни одна из них не относится к моей проблеме.

Это мое загрузочное приложение Spring (аргументы передаются SpringApplication)

@SpringBootApplication
@ComponentScan("com.mycompany")
public class App {

  public static void main(String[] args) {
    SpringApplication.run(App.class, args);
  }
}

Здесь находится компонент и свойство

@Component
public class TaskProcessor implements com.mycompnay.fwk.task.engine.TaskProcessor {

  private RestTemplate restTemplate = new RestTemplate();

  @Value("${mycompany.converter.converter-uri.office}")
  private String converterUriOffice;
}

Переданный параметр полученприложением (извлечено из отладчика):

0:"--debug=true"
1:"--logging.level.org.springframework.web=TRACE"
2:"--mycompany.converter.converter-uri.office=foo"
hash:0
value:char[44]@25

Я ожидаю, что свойство converterUriOffice будет иметь значение foo Вместо этого оно получает свое значение от сервера конфигурации (http://localhost:3000/convert/office)

Ответы [ 2 ]

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

Ссылки от Devilluminati сделали свою работу.Большое спасибо!Чтобы сделать это как можно более понятным, вот что я должен был сделать.

1- У моего приложения есть соответствующий файл YML, обслуживаемый сервером конфигурации с именем application.yml

2- Внутриapplication.yml, у меня есть два профиля, и я хотел только возможность переопределить аргументы при использовании локального профиля.Итак, вот что я должен был добавить в application.yml:

spring:
  profiles: local
  cloud:
    config:
      override-system-properties: false 

Как только я это сделал (и перезапустил сервер конфигурации, чтобы убедиться, что он вытягивает последний YML), я могу переопределить значение вышепередав следующую строку в командную строку:

--mycompany.converter.converter-uri.office=foo
0 голосов
/ 22 июня 2019

в документации встречается следующее https://cloud.spring.io/spring-cloud-static/Edgware.SR2/single/spring-cloud.html#overriding-bootstrap-properties

Переопределение значений удаленных свойств Источники свойств, которые добавляются в ваше приложение в контексте начальной загрузки, часто бывают «удаленными» (например, с сервера конфигурации).), и по умолчанию они не могут быть переопределены локально, кроме как в командной строке.Если вы хотите, чтобы ваши приложения переопределяли удаленные свойства своими собственными Системными свойствами или файлами конфигурации, удаленный источник свойств должен предоставить ему разрешение, установив spring.cloud.config.allowOverride = true (это не работает, чтобы установить этолокально).Как только этот флаг установлен, существуют некоторые более точные настройки для управления расположением удаленных свойств по отношению к свойствам системы и локальной конфигурации приложения: spring.cloud.config.overrideNone = true для переопределения с любым локальным источником свойств и spring.cloud.config.overrideSystemProperties = false, если только системные свойства и переменные env должны переопределять удаленные настройки, но не локальные конфигурационные файлы.

та же проблема здесь с решением https://github.com/spring-cloud/spring-cloud-config/issues/907

Документация не очень ясна, потому что в ней говорится, что аргументы командной строки всегда имеют приоритет над удаленной конфигурацией.

Источники свойств, которые добавляются в ваше приложение контекстом начальной загрузки, часто являются "удаленными" (например,с сервера конфигурации), и по умолчанию они не могут быть переопределены локально, кроме как в командной строке.

Для этого вам необходимо активировать конфигурацию spring.cloud.config.override-system-properties=false (документация говорит только о свойствах системы, но онакажется бприменимо и к аргументам командной строки).

...