bigywater.tech
Spring · 160

Could not resolve placeholder:占位符找不到的几种原因

@Value 报 Could not resolve placeholder,是 key 拼错、文件没读到、还是 profile 没激活?默认值、嵌套占位符、驼峰与短横线、环境变量分别怎么匹配?这篇在 Spring Boot 4.0.8 上逐个复现。

4 种原因
属性没定义、key 拼错、文件名写成 app.properties、profile 没激活,报错都是 Could not resolve placeholder
7 / 8
8 种文件与环境变量组合里 @Value 取到值的个数;只有「文件是短横线、@Value 写驼峰」那一种取不到
null
@ConfigurationProperties 绑定的字段没有配置时是 null,启动不报错

同一个报错

实测 · 本机执行输出
  属性存在 my.key=1:启动成功:v=[1]
  属性根本没有定义:启动失败:Caused by: org.springframework.util.PlaceholderResolutionException: Could not resolve placeholder 'my.key' in value "${my.key}"
  key 拼错(文件里是 my.kye=1):启动失败:Caused by: org.springframework.util.PlaceholderResolutionException: Could not resolve placeholder 'my.key' in value "${my.key}"
  配置文件名写成 app.properties(不是 application.properties):启动失败:Caused by: org.springframework.util.PlaceholderResolutionException: Could not resolve placeholder 'my.key' in value "${my.key}"
  配置在 application-dev.properties 里,没有激活 dev:启动失败:Caused by: org.springframework.util.PlaceholderResolutionException: Could not resolve placeholder 'my.key' in value "${my.key}"
  同样,用 -Dspring.profiles.active=dev 激活 dev:启动成功:v=[1]

四种成因报错完全一样。

默认值与嵌套

实测 · 本机执行输出
  ${my.key:} 空默认值:启动成功:v=[]
  ${my.key:fallback}:启动成功:v=[fallback]
  ${my.key: fallback}(冒号后面有一个空格):启动成功:v=[ fallback]
  嵌套占位符 ${a.${b}},b=x,a.x=1:启动成功:v=[1]
  嵌套占位符,b 没有定义:启动失败:Caused by: org.springframework.util.PlaceholderResolutionException: Could not resolve placeholder 'b' in value "${a.${b}}"
  属性值里引用了不存在的占位符(my.key=${other}):启动失败:Caused by: org.springframework.util.PlaceholderResolutionException: Could not resolve placeholder 'other' in value "${other}" <-- "${my.key}"
  属性值里引用了存在的占位符(my.key=${other},other=7):启动成功:v=[7]

默认值的空格会成为值的一部分;嵌套与引用链的报错会指出缺失的占位符。

命名风格

实测 · 本机执行输出
  文件内容 [my.some-key=1] 环境变量 [(无)],@Value("${my.someKey}"):启动失败:Caused by: org.springframework.util.PlaceholderResolutionException: Could not resolve placeholder 'my.someKey' in value "${my.someKey}"
  文件内容 [my.someKey=1] 环境变量 [(无)],@Value("${my.some-key}"):启动成功:v=[1]
  文件内容 [my.some-key=1] 环境变量 [(无)],@Value("${my.some-key}"):启动成功:v=[1]
  文件内容 [my.someKey=1] 环境变量 [(无)],@Value("${my.someKey}"):启动成功:v=[1]
  文件内容 [(无)] 环境变量 [MY_KEY=1],@Value("${my.key}"):启动成功:v=[1]
  文件内容 [(无)] 环境变量 [MY_SOMEKEY=1],@Value("${my.some-key}"):启动成功:v=[1]
  文件内容 [(无)] 环境变量 [MY_SOME_KEY=1],@Value("${my.some-key}"):启动成功:v=[1]
  文件内容 [(无)] 环境变量 [MY_SOMEKEY=1],@Value("${my.someKey}"):启动成功:v=[1]

@Value 写短横线形式能匹配文件里的短横线或驼峰,以及环境变量。

ConfigurationProperties

实测 · 本机执行输出
  @ConfigurationProperties("my") 里 key 没有配置:启动成功:key=[null]
  加 @Validated 与 @NotBlank,key 没有配置:启动失败:Binding to target demo.Svc failed:

缺失时静默为 null,要靠校验兜底。

分步演示

配置
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / OpenJDK 21.0.12(Homebrew) / Spring Boot 4.0.8(Spring Framework 7.0.9、Tomcat 11.0.24) / Spring Cloud 2025.1.3;用 javac 编译、java 直接运行,依赖由 Maven 从 Maven Central 解析;数字每次运行会有小幅抖动(Spring Boot 4.0.8 的 spring-boot-starter;每个场景是一个独立的最小应用,非 Web,application.properties 放在 classpath 根目录,用 SpringApplication 直接启动;环境变量通过子进程的环境传入)
    • 没有验证:application.yml 的写法;spring.config.import 导入的文件缺失;@TestPropertySource 与测试里的占位符;SpEL 表达式 #{…} 与 ${…} 混用;配置中心(Nacos、Config Server)里的属性;Windows 下环境变量的大小写;@Value 作用在构造器参数与 @Bean 方法参数上的差别
    京ICP备2026067502号-1京公网安备11010502063487号