2015-03-13 46 views
1

我試圖對將使用Zuul的項目使用spring-cloud棧。在我的組織中,我們有一個基於xml的自定義配置堆棧,並執行屬性組合和分層覆蓋。由於處理這種配置的方式,我努力爲它創建一個PropertySource。如何創建一個依賴於Spring Bean的自定義Spring PropertySource

我的自定義PropertySource必須使用我的配置bean,但由於PropertySources在啓動bootstrap期間被初始化,所以應用程序上下文尚未完全初始化,而且我無法訪問我的自定義Bean,這暴露了我們基於xml的配置系統。

@ConfigurationProperties似乎完全偏向.properties和.yaml文件。 Config bean在ApplicationContextInitializer中初始化。有沒有辦法在各種服務中延遲ConfigurationProperties的解析,以便在初始化後使用Config bean構建自定義屬性源?

+0

[spring-cloud-consul-config] [1]使用spring cloud config bootstrap機制,以便正常的應用程序上下文具有值。 [1]:https://github.com/spring-cloud/spring-cloud-consul/tree/master/spring-cloud-consul-config – spencergibb 2015-03-13 17:01:15

+0

謝謝你斯賓塞。這是一個有用的鏈接,可以具體說明Syer先生聯繫的官方文件中提到的內容。 – digitaljoel 2015-03-13 19:58:36

回答

2

我最初嘗試(在提出問題之前)在我的配置中創建一個自定義PropertySourceLocator(如Dave Syer所述,並在他給出的鏈接中有詳細記錄),並將其註冊到我自己的spring.factories(再次演示在Spencer Gibb給出的有用鏈接中)。問題是我的屬性源需要在ApplicationContextInitializer中完成的一些工作之後進行配置,並且屬性源似乎在發生之前就已經被解析了(至少那些有線作爲org.springframework.cloud.bootstrap.BootstrapConfiguration的工廠)。我想我暗示了這一點,說我需要一個特殊的bean在我的PropertySource中,當時我無法從ApplicationContext獲得。

總之,要解決這個問題,我現在登記在財產來源PriorityOrderedApplicationContextInitializer了一個又一個初始化我的配置對象發生。喜歡的東西:context.getEnvironment().getPropertySources().addFirst(myPropertySource);

這似乎是在正確的時間,讓我的財產來源到環境中,並允許在需要我的手之前執行方面的定製。

2

在Spring Cloud中,您需要註冊一些具有PropertySourceLocator bean的BootstrapConfiguration(根據用戶指南:http://projects.spring.io/spring-cloud/spring-cloud.html#customizing-bootstrap-property-sources)。它不應該比這更難。

P.S. @ConfigurationProperties不偏向.properties和.yaml文件 - 它綁定到對文件格式一無所知的Environment

+1

在ConfigurationProperties上採用的點不偏向.properties和.yaml文件。在配置中,似乎任何一種重寫都將以這種方式完成。我碰到麻煩的地方是我正在實現PropertySource而不是EnumerablePropertySource(通過Spencer的鏈接找到),所以它無法正確映射我的自定義屬性。可悲的是,我沒有找到任何有關PropertySource中getProperty應該返回的文檔的很好的文檔,而且Object不是很直觀。是的,我知道我聽起來很困惑...... – digitaljoel 2015-03-13 20:35:58

相關問題