将 Yaml 中的列表映射到 Spring Boot 中的对象列表

2022-08-31 14:14:23

在我的Spring Boot应用程序中,我有appplication.yaml配置文件,其中包含以下内容。我想将其作为配置对象注入,其中包含通道配置列表:

available-payment-channels-list:
  xyz: "123"
  channelConfigurations:
    -
      name: "Company X"
      companyBankAccount: "1000200030004000"
    -
      name: "Company Y"
      companyBankAccount: "1000200030004000"

@Configuration对象,我想用付款配置对象列表填充:

    @ConfigurationProperties(prefix = "available-payment-channels-list")
    @Configuration
    @RefreshScope
    public class AvailableChannelsConfiguration {

        private String xyz;

        private List<ChannelConfiguration> channelConfigurations;

        public AvailableChannelsConfiguration(String xyz, List<ChannelConfiguration> channelConfigurations) {
            this.xyz = xyz;
            this.channelConfigurations = channelConfigurations;
        }

        public AvailableChannelsConfiguration() {

        }

        // getters, setters


        @ConfigurationProperties(prefix = "available-payment-channels-list.channelConfigurations")
        @Configuration
        public static class ChannelConfiguration {
            private String name;
            private String companyBankAccount;

            public ChannelConfiguration(String name, String companyBankAccount) {
                this.name = name;
                this.companyBankAccount = companyBankAccount;
            }

            public ChannelConfiguration() {
            }

            // getters, setters
        }

    }

我正在将其作为具有构造函数@Autowired普通bean注入。xyz的值被正确填充,但是当Spring试图将yaml解析为我得到的对象列表时

   nested exception is java.lang.IllegalStateException: 
    Cannot convert value of type [java.lang.String] to required type    
    [io.example.AvailableChannelsConfiguration$ChannelConfiguration] 
    for property 'channelConfigurations[0]': no matching editors or 
    conversion strategy found]

有什么线索吗?


答案 1

原因一定是在别的地方。仅使用Spring Boot 1.2.2开箱即用,无需配置,它就是工作。看看这个回购 - 你能让它打破吗?

https://github.com/konrad-garus/so-yaml

您确定 YAML 文件的外观与粘贴方式完全相同吗?没有多余的空格,字符,特殊字符,错误缩进或类似的东西?是否有可能在搜索路径中的其他位置有另一个文件,而不是您期望的文件?


答案 2
  • 您不需要构造函数
  • 无需对内部类进行批注
  • RefreshScope与 一起使用时出现一些问题。请参阅此 github 问题@Configuration

像这样更改您的类:

@ConfigurationProperties(prefix = "available-payment-channels-list")
@Configuration
public class AvailableChannelsConfiguration {

    private String xyz;
    private List<ChannelConfiguration> channelConfigurations;

    // getters, setters

    public static class ChannelConfiguration {
        private String name;
        private String companyBankAccount;

        // getters, setters
    }

}

推荐