Tôi gặp phải vấn đề tương tự ngày hôm nay, nhưng tiếc là giải pháp của Andy không phù hợp với tôi. Trong Spring Boot 1.2.1.RELEASE thậm chí còn dễ dàng hơn, nhưng bạn phải lưu ý một số điều.
Đây là phần thú vị từ của tôi 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
bản đồ chỉ chứa một mục nhập bản đồ, mục tiêu của tôi là cung cấp cấu hình động cho các nhà cung cấp OAuth khác. Tôi muốn đưa bản đồ này vào một dịch vụ sẽ khởi tạo các dịch vụ dựa trên cấu hình được cung cấp trong tệp yaml này. Cách triển khai ban đầu của tôi là:
@Service
@ConfigurationProperties(prefix = 'oauth')
class OAuth2ProvidersService implements InitializingBean {
private Map<String, Map<String, String>> providers = [:]
@Override
void afterPropertiesSet() throws Exception {
initialize()
}
private void initialize() {
//....
}
}
Sau khi khởi động ứng dụng, providers
bản đồ trong OAuth2ProvidersService
không được khởi tạo. Tôi đã thử giải pháp do Andy đề xuất, nhưng nó không hiệu quả. Tôi sử dụng Groovy trong ứng dụng đó, vì vậy tôi quyết định xóa private
và để Groovy tạo getter và setter. Vì vậy, mã của tôi trông như thế này:
@Service
@ConfigurationProperties(prefix = 'oauth')
class OAuth2ProvidersService implements InitializingBean {
Map<String, Map<String, String>> providers = [:]
@Override
void afterPropertiesSet() throws Exception {
initialize()
}
private void initialize() {
//....
}
}
Sau thay đổi nhỏ đó, mọi thứ đều hoạt động.
Mặc dù có một điều có thể đáng nói. Sau khi làm cho nó hoạt động, tôi quyết định tạo trường này private
và cung cấp setter với kiểu đối số thẳng trong phương thức setter. Thật không may, nó sẽ không làm việc đó. Nó gây ra org.springframework.beans.NotWritablePropertyException
với thông báo:
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?
Hãy ghi nhớ điều này nếu bạn đang sử dụng Groovy trong ứng dụng Spring Boot của mình.
info
bản đồ vào bên trongMapBindingSample
vì một số lý do (có thể vì nó được sử dụng để chạy ứng dụng trongSpringApplication.run
cuộc gọi).