Spring Boot 2.6.3 未在对象列表上绑定 @ConfigurationProperties
SpringBoot 2.6.3 not binding @ConfigurationProperties on List of Objects
我知道这一定很简单,而且我已经看到多个类似的问题,但是我的整个设置似乎没问题(在其他帖子中已解决),但问题仍然存在。
这是我的设置
环境
- Spring开机
2.6.3
- Java
17
application.yml
platforms:
configs:
- platform: ABC
base-url: https://some-url-01.com/api
description:
logo:
- platform: DEF
base-url: https://some-url-02.com/api
description:
logo:
配置属性
@Data
@ConstructorBinding
@ConfigurationProperties(prefix = "platforms")
public class PlatformProperties {
private final List<PlatformConfig> configs = new ArrayList<>();
@Data
public static class PlatformConfig {
private final Platform platform;
private final String baseUrl;
private final String description;
private final String logo;
}
}
Platform.java - 一个简单的枚举
public enum Platform {
ABC, DEF
}
配置
@Slf4j
@Configuration
@RequiredArgsConstructor
@EnableConfigurationProperties(PlatformProperties.class)
public class ClientConfig {
private final PlatformProperties platformProperties;
@PostConstruct
public void showProperties(){
platformProperties.getConfigs().forEach(System.out::println);
}
}
整个设置看起来非常好(参考:Spring Docs),但是 platformProperties.getConfigs()
始终是空的,因为 application.yml
中定义的 platforms.configs
没有绑定
我在另一个项目 (springboot 2.5.7
/ Java 8
) 上有类似的设置,一切都按预期工作。
这个setup/configs怎么错了???
嗯,这个问题我早就解决了,只是想提供答案,也很简单。
你看到这条线了吗?
private final List<PlatformConfig> configs = new ArrayList<>();
那是罪魁祸首。
请注意,configs
变量是最终变量,并且已经分配了一个 new ArrayList<>()
作为它的值,因此它是不可变的。
解决方案是删除初始分配,因此该行变为;
private final List<PlatformConfig> configs;
构造函数绑定正常,configs
值按预期填充。
我知道这一定很简单,而且我已经看到多个类似的问题,但是我的整个设置似乎没问题(在其他帖子中已解决),但问题仍然存在。
这是我的设置
环境
- Spring开机
2.6.3
- Java
17
application.yml
platforms:
configs:
- platform: ABC
base-url: https://some-url-01.com/api
description:
logo:
- platform: DEF
base-url: https://some-url-02.com/api
description:
logo:
配置属性
@Data
@ConstructorBinding
@ConfigurationProperties(prefix = "platforms")
public class PlatformProperties {
private final List<PlatformConfig> configs = new ArrayList<>();
@Data
public static class PlatformConfig {
private final Platform platform;
private final String baseUrl;
private final String description;
private final String logo;
}
}
Platform.java - 一个简单的枚举
public enum Platform {
ABC, DEF
}
配置
@Slf4j
@Configuration
@RequiredArgsConstructor
@EnableConfigurationProperties(PlatformProperties.class)
public class ClientConfig {
private final PlatformProperties platformProperties;
@PostConstruct
public void showProperties(){
platformProperties.getConfigs().forEach(System.out::println);
}
}
整个设置看起来非常好(参考:Spring Docs),但是 platformProperties.getConfigs()
始终是空的,因为 application.yml
中定义的 platforms.configs
没有绑定
我在另一个项目 (springboot 2.5.7
/ Java 8
) 上有类似的设置,一切都按预期工作。
这个setup/configs怎么错了???
嗯,这个问题我早就解决了,只是想提供答案,也很简单。
你看到这条线了吗?
private final List<PlatformConfig> configs = new ArrayList<>();
那是罪魁祸首。
请注意,configs
变量是最终变量,并且已经分配了一个 new ArrayList<>()
作为它的值,因此它是不可变的。
解决方案是删除初始分配,因此该行变为;
private final List<PlatformConfig> configs;
构造函数绑定正常,configs
值按预期填充。