2016-10-07 2 views
10

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

И они тянут в файле .java как этот

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

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

+0

Вам нужно загрузить оба свойства yaml одновременно или в разных средах - например. dev/test/prod? Кроме того, вам нужны свойства Configurations или вы можете жить с источником Properties? например. @PropertySource ("classpath: $ {some.file.name} .yaml") - таким образом вы можете использовать переменную env SUSE SOME_FILE_NAME или параметр, как -Dsome.file.name =, в стартовом вызове командной строки java. – chaos

+0

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

+0

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

ответ

3

No.

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

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

+0

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

+0

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

8

От documentation:

SpringApplication загрузит свойства из application.properties (или application.yml) файлов в следующих местах и ​​добавить их к весне Environment :

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

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

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

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

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

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

5

Ваш вопрос на самом деле не сказать, что вы собираетесь делать, но если вы хотите иметь другую конфигурацию для различных сред (например 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.

Смежные вопросы