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

Spring Boot 2.0.0-RELEASE ConfigurationProperties绑定失效求助

解决Spring Boot 2.0.0.RELEASE中@ConfigurationProperties绑定YAML配置失败的问题

这个错误的核心原因是Spring Boot 2.0开始,@PropertySource注解默认不再支持加载YAML格式的配置文件,而你在DatabaseProperties中使用了@PropertySource("classpath:database.yml"),导致Spring无法正确解析YAML内容,把app节点当成了普通字符串,进而无法转换为DatabaseProperties对象。

下面是具体的修改方案,你可以根据自己的场景选择:

方案一:移除@PropertySource,利用Spring Boot自动加载YAML配置

这是最推荐的方式,符合Spring Boot的约定优于配置原则:

  1. 确保你的配置文件(比如database.yml或external.yml)放在src/main/resources目录下,若要加载外部文件,可通过启动参数--spring.config.location=file:/path/to/your/external.yml指定路径。
  2. 修改DatabaseProperties类,移除@PropertySource注解,调整注解如下:
@Configuration
@ConfigurationProperties(prefix = "app")
// 借助你pom里已有的Lombok,用@Data自动生成getter/setter,省去手动编写
@Data
public class DatabaseProperties {
    private List<DataSourceFromProperties> datasources;
}

注意:你的DataSourceFromProperties类同样需要有完整的getter/setter,或者也加上@Data注解。

  1. 确保YAML配置格式正确(YAML对缩进要求严格,修正后的格式如下):
app:
  datasources:
    - name: sourceOne
      driver: xxx
      url: some_url
      username: u1
      password: p1
    - name: sourceTwo
      driver: xxx
      url: some_url2
      username: u2
      password: p2

方案二:自定义PropertySourceFactory支持YAML加载

如果你一定要通过@PropertySource加载YAML文件,可以自定义一个工厂类来处理:

  1. 创建YamlPropertySourceFactory类:
import org.springframework.boot.env.YamlPropertySourceLoader;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;

import java.io.IOException;
import java.util.List;

public class YamlPropertySourceFactory extends DefaultPropertySourceFactory {
    @Override
    public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
        if (resource == null) {
            return super.createPropertySource(name, resource);
        }
        List<PropertySource<?>> sources = new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource());
        return sources.get(0);
    }
}
  1. 在DatabaseProperties的@PropertySource注解中指定这个工厂:
@Component
@PropertySource(value = "classpath:database.yml", factory = YamlPropertySourceFactory.class)
@ConfigurationProperties(prefix = "app")
@Data
public class DatabaseProperties {
    private List<DataSourceFromProperties> datasources;
}

额外检查点

  • 确认代码中引用的配置文件名(比如database.yml)和你实际使用的external.yml一致,或者调整路径指向正确的文件。
  • 确保DataSourceFromProperties类的字段名和YAML中的键完全匹配(比如YAML里的name对应类里的name字段),避免因命名不匹配导致绑定失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:07:46