亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

春季:以Map或Properties對象的形式訪問所有Environment屬性

春季:以Map或Properties對象的形式訪問所有Environment屬性

牧羊人nacy 2019-11-29 10:13:12
我正在使用注釋來配置我的spring環境,如下所示:@Configuration...@PropertySource("classpath:/config/default.properties")...public class GeneralApplicationConfiguration implements WebApplicationInitializer {    @Autowired    Environment env;}這導致我的財產default.properties成為的一部分Environment。我想在@PropertySource這里使用該機制,因為它已經可以根據環境設置(例如config_dir位置)通過多個后備層和不同的動態位置來重載屬性。我只是剝離了后備,以使示例更容易。但是,我現在的問題是我想在中配置例如我的數據源屬性default.properties。您可以將設置傳遞給數據源,而無需詳細了解數據源期望使用什么設置Properties p = ...datasource.setProperties(p);但是,問題是,Environment對象既不是Properties對象,也不是對象,也不是Map任何可比較的對象。從我的角度來看,這是根本不可能的訪問環境的所有值,因為沒有keySet或iterator方法或任何可比性。Properties p <=== Environment env?我想念什么嗎?是否可以通過Environment某種方式訪問對象的所有條目?如果是,我可以將條目映射到Map或Properties對象,甚至可以通過前綴過濾或映射它們-將子集創建為標準Java Map...這就是我想要做的。有什么建議么?
查看完整描述

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)));


查看完整回答
反對 回復 2019-11-29
  • 3 回答
  • 0 關注
  • 999 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號