วันนี้ฉันประสบปัญหาเดียวกัน แต่น่าเสียดายที่วิธีแก้ปัญหาของ Andy ไม่ได้ผลสำหรับฉัน ใน Spring Boot 1.2.1 ปล่อยมันง่ายกว่าเดิม แต่คุณต้องระวังบางสิ่ง
นี่คือส่วนที่น่าสนใจจากฉันapplication.yml
:
oauth:
providers:
google:
api: org.scribe.builder.api.Google2Api
key: api_key
secret: api_secret
callback: http:
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?
โปรดทราบว่าหากคุณใช้ Groovy ในแอปพลิเคชัน Spring Boot
info
วางแผนที่ไว้ภายในได้MapBindingSample
ด้วยเหตุผลบางประการ (อาจเป็นเพราะมันถูกใช้เพื่อเรียกใช้แอพในการSpringApplication.run
โทร)