如何使用ConfigurationProperties继承绑定yml配置文件的属性值
问题分析
- 你的实现方式存在两处核心错误,和配置类继承本身无关,Spring完全支持配置类继承的属性绑定。
错误1:@ConfigurationProperties前缀不会自动拼接
每个标注了@ConfigurationProperties的类的prefix都是独立生效的,不会因为类的继承关系自动拼接上下级前缀。你当前MongoDbMessageStoreConfig配置的前缀是config.mongodb,Spring只会匹配配置文件根路径下的config.mongodb节点,而你的实际配置在store.messagestore.config.mongodb下,路径完全不匹配,自然会出现空值。
父类如果不需要单独作为配置类被实例化,不需要标注@ConfigurationProperties,该注解加在最终需要实例化的子类上即可。
错误2:@ConfigurationProperties类中混用@Value
@Value注解不会复用@ConfigurationProperties配置的前缀,你写的@Value("${connection_string}")会直接匹配配置文件根路径下的connection_string属性,你的配置是嵌套在多层节点下的,所以直接触发占位符解析失败。
使用@ConfigurationProperties做属性绑定时,只要属性名和配置key匹配(支持宽松绑定,比如驼峰、下划线、中划线自动匹配),并且提供对应setter方法,不需要加@Value就能自动注入。
修复方案
方案1(推荐):统一在子类配置全路径前缀
删除父类上不需要的@ConfigurationProperties注解,子类配置完整前缀,删除@Value注解即可:
// 父类不需要单独绑定的话,不需要加@ConfigurationProperties public class StoreConfig {}
public class MessageStoreConfig extends StoreConfig {}
@Component @ConfigurationProperties(prefix = "store.messagestore.config.mongodb") public class MongoDbMessageStoreConfig extends MessageStoreConfig { // 不需要加@Value,有setter就能自动绑定 private String connectionString; public String getConnectionString() { return connectionString; } public void setConnectionString(String connectionString) { this.connectionString = connectionString; } }
方案2:坚持分层绑定的调整方式
如果确实需要父类独立绑定对应的前缀,需要分别给每个配置类配置完整前缀,并且通过@EnableConfigurationProperties注册所有需要绑定的配置类,但这种方式会让配置路径分散,不推荐使用。
内容的提问来源于stack exchange,提问作者pjsagar
相关产品推荐
相关产品推荐

