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的约定优于配置原则:
- 确保你的配置文件(比如
database.yml或external.yml)放在src/main/resources目录下,若要加载外部文件,可通过启动参数--spring.config.location=file:/path/to/your/external.yml指定路径。 - 修改
DatabaseProperties类,移除@PropertySource注解,调整注解如下:
@Configuration @ConfigurationProperties(prefix = "app") // 借助你pom里已有的Lombok,用@Data自动生成getter/setter,省去手动编写 @Data public class DatabaseProperties { private List<DataSourceFromProperties> datasources; }
注意:你的
DataSourceFromProperties类同样需要有完整的getter/setter,或者也加上@Data注解。
- 确保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文件,可以自定义一个工厂类来处理:
- 创建
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); } }
- 在
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
相关产品推荐
相关产品推荐

