Spring Boot中@ConfigurationProperties无法读取application.properties配置值的原因及解决方法
为什么你的Spring Boot配置类读不到application.properties的值?
看起来你遇到了配置绑定的典型问题,咱们一步步拆解原因和修复方法:
问题根源
1. 配置键与类属性的绑定不匹配
Spring Boot的@ConfigurationProperties遵循驼峰属性 ↔ 短横线/点分隔配置键的映射规则,但你的配置和类属性完全对不上:
- 你的配置类prefix是
dolphin.redis,属性是userSubArticleKey,对应的正确配置键应该是dolphin.redis.user-sub-article-key(短横线分隔)或者dolphin.redis.userSubArticleKey(驼峰形式)。 - 但你现在的配置是
dolphin.redis.user.sub.article.key,这是一个四层嵌套的结构(user→sub→article→key),和你配置类里的单层属性userSubArticleKey没有任何绑定关系,Spring自然无法把值注入进去。
2. 注解使用错误
@ConfigurationPropertiesScan是用来扫描@ConfigurationProperties类的,它应该加在启动类上,而不是配置类本身。- 你的注解组合有点冗余:如果启动类已经加了
@EnableConfigurationProperties(CruiseRedisKeysConfig.class),配置类上的@Component可以去掉;或者如果启动类加了@ConfigurationPropertiesScan,那@EnableConfigurationProperties和@Component都可以省略,Spring会自动处理。
修复方案(两种选其一就行)
方案一:修改配置文件,适配现有配置类
保持配置类不变,把application.properties里的配置键改成短横线分隔形式:
dolphin.redis.user-sub-article-key=cruise:user:sub:article:
然后调整注解:
- 配置类移除
@ConfigurationPropertiesScan:
package com.dolphin.soa.post.common.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Data @Component @ConfigurationProperties(prefix = "dolphin.redis") public class CruiseRedisKeysConfig { private String userSubArticleKey; }
- 启动类可以去掉
@EnableConfigurationProperties(因为@Component已经把配置类注册成Bean了):
public class AppStarter {}
方案二:修改配置类结构,适配现有多层级配置
如果想保留dolphin.redis.user.sub.article.key这个配置键,就得把配置类改成嵌套结构来匹配层级:
package com.dolphin.soa.post.common.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Data @Component @ConfigurationProperties(prefix = "dolphin.redis") public class CruiseRedisKeysConfig { private User user; @Data public static class User { private Sub sub; @Data public static class Sub { private Article article; @Data public static class Article { private String key; } } } }
之后获取值的时候要通过层级调用:cruiseRedisKeysConfig.getUser().getSub().getArticle().getKey()。同时记得把@ConfigurationPropertiesScan移到启动类:
@ConfigurationPropertiesScan public class AppStarter {}
额外小提示
- 确认
application.properties在src/main/resources目录下,这是Spring Boot默认加载配置的位置。 - 如果你的配置类不在启动类的同包或子包下,记得在
@ConfigurationPropertiesScan里指定包路径,比如@ConfigurationPropertiesScan(basePackages = "com.dolphin.soa.post.common.config")。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

