У меня есть приложение Spring Boot со следующим application.yml
- взятым в основном отсюда :
info:
build:
artifact: ${project.artifactId}
name: ${project.name}
description: ${project.description}
version: ${project.version}
Я могу ввести определенные значения, например
@Value("${info.build.artifact}") String value
Я бы хотел, однако, внедрить всю карту, то есть примерно так:
@Value("${info}") Map<String, Object> info
Возможно ли это (или что-то подобное)? Очевидно, я могу загрузить yaml напрямую, но мне было интересно, есть ли что-то уже поддерживаемое Spring.
java
spring
spring-boot
левант пестрый
источник
источник
info
карту внутрьMapBindingSample
по какой-то причине (возможно, потому, что она используется для запуска приложения вSpringApplication.run
вызове).info.build
вместоinfo
карты выше?locations
(чтобы получить свойства из другогоyml
файла вместо значения по умолчаниюapplication.yml
)@ConfigurationProperties
он работал, за исключением того, что не приводил к замене заполнителей. Например, если у вас былоproject.version=123
задано системное свойство , пример, который вы указали в ответе, вернетсяversion=123
, а после установкиlocations
он вернетсяproject.version=${project.version}
. Вы знаете, есть ли здесь какие-то ограничения?Нижеприведенное решение является сокращением для решения @Andy Wilkinson, за исключением того, что оно не должно использовать отдельный класс или
@Bean
аннотированный метод.application.yml:
SomeComponent.java:
Мы можем объединить как
@Value
аннотацию, так и@ConfigurationProperties
без проблем. Но геттеры и сеттеры важны, и они@EnableConfigurationProperties
должны@ConfigurationProperties
работать.Я попробовал эту идею из отличного решения, предоставленного @Szymon Stepniak, подумал, что это будет кому-то полезно.
источник
@EnableConfigurationProperties
Сегодня я столкнулся с той же проблемой, но, к сожалению, решение Энди у меня не сработало. В Spring Boot 1.2.1.RELEASE это еще проще, но вы должны знать несколько вещей.
Вот интересная часть из моих
application.yml
:providers
map содержит только одну запись карты, моя цель - предоставить динамическую конфигурацию для других поставщиков OAuth. Я хочу внедрить эту карту в службу, которая будет инициализировать службы на основе конфигурации, представленной в этом yaml-файле. Моя первоначальная реализация была:После запуска приложения
providers
картаOAuth2ProvidersService
не была инициализирована. Я попробовал решение, предложенное Энди, но оно тоже не сработало. Я использую Groovy в этом приложении, поэтому я решил удалитьprivate
и позволить Groovy генерировать методы получения и установки. Итак, мой код выглядел так:После этого небольшого изменения все заработало.
Хотя есть одна вещь, о которой стоит упомянуть. После того, как я заставил его работать, я решил создать это поле
private
и предоставить сеттеру прямой тип аргумента в методе сеттера. К сожалению, это не сработает. Это вызываетorg.springframework.beans.NotWritablePropertyException
сообщение:Имейте это в виду, если вы используете Groovy в своем приложении Spring Boot.
источник
Чтобы получить карту из конфигурации, вам понадобится класс конфигурации. К сожалению, аннотация @Value не поможет.
Application.yml
Класс конфигурации:
источник
Решение для извлечения карты с использованием @Value из свойства application.yml, закодированного как многострочный
Здесь значение для нашего свойства карты "my-map-property-name" хранится в формате JSON внутри строки, и мы достигли многострочного значения, используя \ в конце строки.
Больше объяснений
\ в yaml используется для разбивки строки на многострочную
\ " - escape-символ для" (цитата) в строке yaml
{key: value} JSON в yaml, который будет преобразован в карту с помощью @Value
# {} это выражение SpEL, которое можно использовать в @Value для преобразования json int Map или Array / list Reference
Протестировано в проекте весенней загрузки
источник
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-Configuration-Binding
источник
Вы можете сделать его еще проще, если хотите избежать лишних структур.
А потом использовать как обычно, например с конструктором:
источник