Я зіткнувся з тією ж проблемою і сьогодні, але, на жаль, рішення Енді не спрацювало для мене. У весняному завантаженні 1.2.1. ЗВІТКА це ще простіше, але ви повинні знати про деякі речі.
Ось цікава частина з мого 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
карта містить лише один запис карти, моя мета - надати динамічну конфігурацію для інших постачальників 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
і надати сеттеру прямий тип аргументу в методі setter. На жаль, це звичайно не працює. Це викликає 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
виклику).