Использование двух файлов yaml для свойств конфигурации

#java #spring-boot #properties #configuration #yaml

#java #весенняя загрузка #свойства #конфигурация #yaml

Вопрос:

Мы используем приложение spring boot, в котором свойства загружаются из application.yml файла, а не из application.properties файла, расположенного по src/main/resources/ адресу, который выглядит следующим образом:

 config: 
  host: localhost:8080  
  server: 123  
  

И они извлекаются в .java файл, подобный этому

 @ConfigurationProperties( prefix="config")  
public class ConnectionImpl implements Connection{
  @Value("${config.host}")
  private Stringhost;
} 
  

Я могу получить свойства таким образом.
Но мы пытаемся переместить свойства конфигурации из application.yml в другой .yml файл, который находится в другом месте. ( src/main/resources/env-config ).
Теперь я не могу получить свойства таким же образом, то есть с помощью @Value аннотации. Есть ли какие-либо другие аннотации, которые мне нужно добавить?

Комментарии:

1. Вам нужно загружать оба свойства yaml одновременно или в разных средах — например, в средах разработки / тестирования / разработки? Кроме того, вам нужны свойства конфигурации или вы могли бы работать с источником свойств? например. @PropertySource(«путь к классу:${some.file.name }.yaml») — таким образом, вы можете использовать переменную OS env SOME_FILE_NAME или параметр, подобный -Dsome.file.name = в вызове запуска командной строки java.

2. Нам нужны оба одновременно. Нам нужны свойства конфигурации.

3. В этом случае я бы использовал сочетание нескольких файлов свойств переменных сред. Например, у меня были бы «jms.<environment>.yaml» и «db.<environment>.yaml» и даже «утилиты. <environment>.yaml». Каждый из этих файлов будет иметь pojo с аннотацией @PropertySource(«путь к классу:/com/${my.path:default/path}/db.${env:local}.properties») — вы можете переопределить это с помощью -Dmy.path=path/to/yaml/filesи -Denv= dev в командной строке — поэтому, если вы поместите свой yaml в свои банки, он найдет там реквизиты, но если вам нужно изменить это на файл yaml в файловой системе, вы также можете переопределить его там.

4. Извините, я ответил PropertiesSource , но вы также должны иметь возможность использовать ConfigurationProperties вместо этого, с той же моделью, которую spring boot сконструирует для вас автоматически.

Ответ №1:

Из документации:

SpringApplication загрузит свойства из application.properties (или application.yml ) файлов в следующих расположениях и добавит их в Spring Environment :

  1. /config Подкаталог текущего каталога.
  2. Текущий каталог
  3. Пакет пути к классу /config
  4. Корневой путь к классу

Если вам не нравится application.properties имя файла конфигурации, вы можете переключиться на другое, указав spring.config.name свойство окружающей среды. Вы также можете ссылаться на явное местоположение, используя свойство spring.config.location среды (разделенный запятыми список местоположений каталогов или путей к файлам).

Всегда используется путь поиска по умолчанию classpath:,classpath:/config,file:,file:config/ , независимо от значения spring.config.location . Этот путь поиска упорядочен от самого низкого до самого высокого приоритета ( file:config/ wins). Если вы укажете свои собственные местоположения, они будут иметь приоритет над всеми местоположениями по умолчанию и использовать тот же порядок с наименьшим и наивысшим приоритетом. Таким образом, вы можете настроить значения по умолчанию для своего приложения в application.properties (или любое другое выбранное вами базовое spring.config.name имя) и переопределить его во время выполнения другим файлом, сохраняя значения по умолчанию.

Вам необходимо указать аргумент командной строки, который указывает SpringApplication , где конкретно искать. Если все resources/ добавлено в корневой каталог classpath, то ваша командная строка будет выглядеть следующим образом:

java -jar myproject.jar --Dspring.config.location=classpath:/env-config/service-config.yml

Если у вас есть общий application.yml раздел resources/ , свойства в нем все равно будут загружены, но будут иметь более низкий приоритет перед файлом свойств, указанным в командной строке.

Ответ №2:

В вашем вопросе на самом деле не сказано, что вы собираетесь делать, но если вы хотите иметь другую конфигурацию для разных сред (например development , test , production ), для этого есть простое решение.

Разместите свои конфигурационные файлы в файловой иерархии, подобной этой, внутри вашего проекта:

 src/
  main/
    resources/
      application.yml
      application-development.yml
      application-test.yml
      application-production.yml
  

Когда вы теперь запускаете свое приложение с

 java -jar mySpringApplication.jar -Dspring.profiles.active=development
  

конфигурация из application.yml будет взята в качестве «базового уровня», переопределенного конфигурацией в application-development.yml . Таким образом, вы можете иметь настройки «по умолчанию» для всех сред application.yml и конфигурацию, зависящую от среды, в application-ENV.yml файлах. То же самое работает для test и production .

Ответ №3:

Нет.

Вы будете в гораздо лучшем положении, если будете избегать жесткого кодирования пути к файлу, подобного этому, в своей базе кода. @ConfigurationProperties раньше у locations него был атрибут, но он устарел и уже удален в версии 1.5.

В Spring Boot вы настраиваете Environment , который является единственным источником истины для вашей конфигурации. Вместо того, чтобы иметь настройки, скрытые в коде, вы должны настроить Spring Boot для чтения нужных файлов. Прочитайте документацию для spring.config.location . Если вы хотите сделать это более прозрачным способом, возможно, это то, EnvironmentPostProcessor что вам нужно

Комментарии:

1. Привет, Стефани, спасибо за ответ. Не уверен, что вы имели в виду, говоря об использовании spring.config.location. В моем application.yml я указал местоположение для другого yaml, который я использую, используя config: location: classpath:/env-config/service-config.yml. Но все же он не выбирает свойства отсюда.

2. Чтение документа должно помочь. Вы не можете указать это свойство там, оно должно быть установлено при запуске приложения. Смотрите ссылку, которую я дал для получения более подробной информации.