3 回答

TA貢獻2041條經驗 獲得超4個贊
這是一個老問題,但是公認的答案有一個嚴重的缺陷。如果Spring Environment對象包含任何替代值(如Externalized Configuration中所述),則不能保證它產生的屬性值映射將與Environment對象返回的屬性值匹配。我發現,簡單地通過迭代PropertySource的S- Environment沒有,其實給任何覆蓋值。相反,它產生了原始值,該值應該被覆蓋。
這是一個更好的解決方案。本品采用EnumerablePropertySource的S- Environment迭代通過已知的屬性名稱,但隨后讀取實際值了真正的春天的環境。這樣可以保證該值是Spring實際解析的值,包括所有覆蓋的值。
Properties props = new Properties();
MutablePropertySources propSrcs = ((AbstractEnvironment) springEnv).getPropertySources();
StreamSupport.stream(propSrcs.spliterator(), false)
.filter(ps -> ps instanceof EnumerablePropertySource)
.map(ps -> ((EnumerablePropertySource) ps).getPropertyNames())
.flatMap(Arrays::<String>stream)
.forEach(propName -> props.setProperty(propName, springEnv.getProperty(propName)));
- 3 回答
- 0 關注
- 999 瀏覽
添加回答
舉報