You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot获取配置属性时仅获属性名而非值的问题求助

Spring Boot 2.6.4 @Value获取配置仅返回属性名问题解决

问题回顾

使用Spring Boot 2.6.4开发REST API时,遇到以下问题:

  • 从src/main/resources/application.properties中通过@Value获取配置,不加@PropertySource会抛出占位符解析异常;
  • 添加@PropertySource后,日志显示已找到配置键,但注入的变量值为属性名(如${app.rest.params.requestStatus.refresh})而非实际值10。

配置文件内容:

app.rest.params.requestStatus.refresh=10

控制器注入代码:

@Value("${app.rest.params.requestStatus.refresh}")
private String requestRefreshStatusValue;

解决方案步骤

1. 移除多余的@PropertySource注解

Spring Boot 2.x会自动加载classpath下的application.properties,手动添加@PropertySource("classpath:application.properties")属于冗余操作,甚至可能干扰默认配置加载逻辑。先移除该注解,排查核心问题。

2. 确认启动类位置合法性

确保带有@SpringBootApplication的启动类位于所有业务组件的根包路径下。例如:

  • 若控制器在com.yourproject.controller包,启动类应放在com.yourproject或更上层包。
    @SpringBootApplication默认扫描自身所在包及其子包的组件,启动类位置错误会导致控制器无法被Spring上下文正确识别,引发占位符解析失败。

3. 排查自定义占位符解析器

检查项目中所有@Configuration类,若存在手动注册的PropertyPlaceholderConfigurer或PropertySourcesPlaceholderConfigurer Bean,立即移除。这类自定义Bean会覆盖Spring Boot默认的占位符解析逻辑,导致@Value无法正常解析属性值。

4. 验证配置文件有效性

  • 检查application.properties是否为无BOM的UTF-8编码:部分编辑器保存的UTF-8 BOM格式文件会导致Spring无法正确读取配置值,可通过Notepad++等工具重新保存为「UTF-8 无BOM」格式。
  • 确保键值对格式严谨:避免等号两侧添加多余空格(虽然Spring Boot兼容,但可能引发潜在解析问题),保持key=value的紧凑格式。

5. 改用@ConfigurationProperties绑定(推荐方案)

如果@Value方式始终存在问题,推荐使用Spring Boot官方推荐的@ConfigurationProperties进行配置绑定,稳定性更高:

步骤1:创建配置类

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "app.rest.params.requeststatus")
public class AppConfig {
    private Integer refresh;

    // Getter & Setter
    public Integer getRefresh() {
        return refresh;
    }

    public void setRefresh(Integer refresh) {
        this.refresh = refresh;
    }
}

步骤2:控制器中注入使用

@RestController
public class RestConfigController {
    private final AppConfig appConfig;

    // 构造器注入(Spring 4.3+推荐方式)
    public RestConfigController(AppConfig appConfig) {
        this.appConfig = appConfig;
    }

    @GetMapping("/config/test")
    public String getConfigValue() {
        return "Refresh interval: " + appConfig.getRefresh();
    }
}

6. 日志排查细节

保持org.springframework.core.env的DEBUG日志开启,重点关注:

  • 配置文件是否被正确加载(日志中会显示Loaded property source 'class path resource [application.properties]');
  • 属性键是否被正确解析(Found key 'app.rest.params.requestStatus.refresh' in PropertySource...)。
    若日志显示属性已加载但注入后仍为占位符字符串,说明自定义配置类干扰了Spring Boot的自动解析流程,需重点排查@Configuration类中的自定义Bean。

内容的提问来源于stack exchange,提问作者PetersonName

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 19:40:05