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 关注
- 962 浏览
添加回答
举报