Spring Boot 3中@Value注入配置报错:无法解析占位符
问题分析与解决方案
问题原因
出现Could not resolve placeholder错误的核心原因:
- 使用
@ConfigurationProperties绑定配置时,Spring默认不会将这些属性暴露到全局Environment中,因此@Value无法直接解析对应的占位符。 - 额外注意:你的配置记录类存在拼写错误,
CrosAllowedOrigins应为CorsAllowedOrigins(正确拼写是cors而非cros),虽不会直接触发当前错误,但建议修正以避免后续潜在问题。
解决方案
方案一:直接注入配置记录类(推荐)
这是Spring Boot配置属性的最佳实践,避开@Value的局限性,直接将配置记录类注入到SecurityConfig中:
public class SecurityConfig { private final List<String> allowedOrigins; // 构造函数注入配置记录类 public SecurityConfig(CrosAllowedOrigins corsAllowedOrigins) { this.allowedOrigins = corsAllowedOrigins.urlOrigins(); } // 后续直接使用allowedOrigins即可 }
方案二:将配置属性暴露到Environment(不推荐)
如果一定要用@Value,可通过以下方式让配置属性进入Environment:
- 在配置记录类上添加
@Configuration注解,使其成为Spring Bean并将属性暴露到Environment:
@Configuration @ConfigurationProperties("cors-allowed-origins") public record CorsAllowedOrigins(List<String> urlOrigins) { }
- 保留主类上的
@EnableConfigurationProperties,此时@Value("${cors-allowed-origins.url-origins}")即可正常解析。
补充说明
优先选择方案一,因为@ConfigurationProperties提供了更强大的配置绑定能力(如类型转换、参数验证等),而@Value更适合简单的单个属性注入。对于嵌套结构或集合类型的配置,使用配置记录类更规范、更易维护。
内容的提问来源于stack exchange,提问作者YosriN
相关产品推荐
相关产品推荐

