Spring Boot 2.6.3 未在对象列表上绑定 @ConfigurationProperties

SpringBoot 2.6.3 not binding @ConfigurationProperties on List of Objects

我知道这一定很简单,而且我已经看到多个类似的问题,但是我的整个设置似乎没问题(在其他帖子中已解决),但问题仍然存在。

这是我的设置

环境

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 值按预期填充。