Сегодня я столкнулся с той же проблемой, но, к сожалению, решение Энди у меня не сработало. В Spring Boot 1.2.1.RELEASE это еще проще, но вы должны знать несколько вещей.
Вот интересная часть из моих application.yml
:
oauth:
providers:
google:
api: org.scribe.builder.api.Google2Api
key: api_key
secret: api_secret
callback: http://callback.your.host/oauth/google
providers
map содержит только одну запись карты, моя цель - предоставить динамическую конфигурацию для других поставщиков OAuth. Я хочу внедрить эту карту в службу, которая будет инициализировать службы на основе конфигурации, представленной в этом yaml-файле. Моя первоначальная реализация была:
@Service
@ConfigurationProperties(prefix = 'oauth')
class OAuth2ProvidersService implements InitializingBean {
private Map<String, Map<String, String>> providers = [:]
@Override
void afterPropertiesSet() throws Exception {
initialize()
}
private void initialize() {
//....
}
}
После запуска приложения providers
карта OAuth2ProvidersService
не была инициализирована. Я попробовал решение, предложенное Энди, но оно тоже не сработало. Я использую Groovy в этом приложении, поэтому я решил удалить private
и позволить Groovy генерировать методы получения и установки. Итак, мой код выглядел так:
@Service
@ConfigurationProperties(prefix = 'oauth')
class OAuth2ProvidersService implements InitializingBean {
Map<String, Map<String, String>> providers = [:]
@Override
void afterPropertiesSet() throws Exception {
initialize()
}
private void initialize() {
//....
}
}
После этого небольшого изменения все заработало.
Хотя есть одна вещь, о которой стоит упомянуть. После того, как я заставил его работать, я решил создать это поле private
и предоставить сеттеру прямой тип аргумента в методе сеттера. К сожалению, это не сработает. Это вызывает org.springframework.beans.NotWritablePropertyException
сообщение:
Invalid property 'providers[google]' of bean class [com.zinvoice.user.service.OAuth2ProvidersService]: Cannot access indexed value in property referenced in indexed property path 'providers[google]'; nested exception is org.springframework.beans.NotReadablePropertyException: Invalid property 'providers[google]' of bean class [com.zinvoice.user.service.OAuth2ProvidersService]: Bean property 'providers[google]' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
Имейте это в виду, если вы используете Groovy в своем приложении Spring Boot.
info
карту внутрьMapBindingSample
по какой-то причине (возможно, потому, что она используется для запуска приложения вSpringApplication.run
вызове).