#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
) файлов в следующих расположениях и добавит их в SpringEnvironment
:
/config
Подкаталог текущего каталога.- Текущий каталог
- Пакет пути к классу
/config
- Корневой путь к классу
Если вам не нравится
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. Чтение документа должно помочь. Вы не можете указать это свойство там, оно должно быть установлено при запуске приложения. Смотрите ссылку, которую я дал для получения более подробной информации.