Spring Boot如何在指定Profile下替换默认YML的Map键值对
解决Spring Boot Profile配置中Map完全覆盖而非合并的问题
这个问题我之前也碰到过!Spring Boot默认会对同类型的集合/Map配置执行合并策略,所以你在profile配置里的mapValues会和主配置的内容混在一起。要实现完全覆盖、只保留profile里的键值对,有两种靠谱的解决办法:
方法一:在YAML中使用!!map标签强制重定义Map
直接在你的application-profile.yml里给mapValues加上YAML的!!map标签,这样Spring Boot就会把它当成一个全新的Map,而不是去合并原有的内容:
mapValues: !!map key3: value3 key4: value4
这个方法不需要修改任何Java代码,只需要调整YAML配置,非常适合快速解决问题。
方法二:通过@ConfigurationProperties的merge属性关闭合并(Spring Boot 2.3+)
如果你是通过@ConfigurationProperties来绑定配置的,可以在注解里设置merge = false,这样当加载profile配置时,会直接覆盖主配置里的Map内容:
首先,你的配置类应该是这样的:
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.Map; @Component @ConfigurationProperties(prefix = "map-values", merge = false) // 这里设置merge=false public class MyMapProperties { private Map<String, String> mapValues; // getter和setter方法 public Map<String, String> getMapValues() { return mapValues; } public void setMapValues(Map<String, String> mapValues) { this.mapValues = mapValues; } }
这样配置后,当激活对应的profile时,mapValues就只会包含profile配置里的key3和key4了。
需要注意的是,merge属性是Spring Boot 2.3版本才引入的,如果你用的是更早的版本,建议优先用第一种方法。
内容的提问来源于stack exchange,提问作者samyem
相关产品推荐
相关产品推荐

