오늘도 같은 문제가 발생했지만 안타깝게도 Andy의 솔루션이 작동하지 않았습니다. 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
지도에는지도 항목이 하나만 포함되어 있습니다. 내 목표는 다른 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
이 초기화되지 않았습니다. Andy가 제안한 솔루션을 시도했지만 제대로 작동하지 않았습니다. 나는 그 응용 프로그램에서 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
호출 에서 앱을 실행하는 데 사용되기 때문일 수 있습니다 ).