我今天遇到了同样的问题,但是不幸的是,安迪的解决方案对我没有用。在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仅包含一个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生成getter和setter。所以我的代码看起来像这样:
@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方法中为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?
如果在Spring Boot应用程序中使用Groovy,请记住这一点。
info
,MapBindingSample
由于某种原因您不能将地图放入其中(可能是因为它被用于在SpringApplication.run
调用中运行应用程序)。