@Value 报 Could not resolve placeholder,是 key 拼错、文件没读到、还是 profile 没激活?默认值、嵌套占位符、驼峰与短横线、环境变量分别怎么匹配?这篇在 Spring Boot 4.0.8 上逐个复现。
属性存在 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("my") 里 key 没有配置:启动成功:key=[null]
加 @Validated 与 @NotBlank,key 没有配置:启动失败:Binding to target demo.Svc failed:缺失时静默为 null,要靠校验兜底。