【问题标题】:Spring Boot loading a list from a config file returns empty listSpring Boot 从配置文件加载列表返回空列表
【发布时间】:2019-06-28 14:11:21
【问题描述】:

我刚刚使用 Spring 初始化程序创建了一个非常基本的 Spring Boot 应用程序,并且正在尝试。我想从 yaml 配置文件中加载一个列表,但它总是返回空。

我有一个自定义配置类

@ConfigurationProperties("example-unit")
@EnableConfigurationProperties
public class ConfigurationUnit {

    public List<String> confiList = new ArrayList<>();

    public List<String> getConfiList() {
        return this.confiList;
    }

}

我的主课是这样的

@SpringBootApplication
public class DemoApplication {

    static ConfigurationUnit configurationUnit = new ConfigurationUnit();


    public static void main(String[] args) {

        SpringApplication.run(DemoApplication.class, args);

        List<String> hello = configurationUnit.getConfiList();

        System.out.print("");
    }

}

我已将 application.yaml 放入资源文件夹。

example-unit:
  - string1
  - string2
  - hello22

我在这里和网上进行了搜索,但无法找出问题所在,我所做的任何更改都没有帮助。我知道我一定做错了什么。

【问题讨论】:

    标签: java spring-boot configuration yaml


    【解决方案1】:

    这个说法是错误的static ConfigurationUnit configurationUnit = new ConfigurationUnit(); 你不应该创建对象

    Spring 只将属性注入到应用上下文处理的 bean 中,spring 创建带有 @ Configuration 注释的类的 bean

    配置单元

    @Configuration
    @ConfigurationProperties("example-unit")
    public class ConfigurationUnit {
    
    public List<String> confiList;
    
    public List<String> getConfiList() {
        return this.confiList;
        }
    
     }
    

    DemoApplication在spring boot main中从applicationcontext中获取bean并从中获取列表对象

    @SpringBootApplication
    public class DemoApplication {
    
    public static void main(String[] args) {
    
        ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
         ConfigurationUnit unit = context.getBean("configurationUnit"):
    
        System.out.print(unit. getConfiList());
       }
    
    }
    

    【讨论】:

    • 好点。我监督了 Application 类中的 static ConfigurationUnit 声明。这当然会扰乱 Spring 众所周知的整个 bean 注入魔法。
    • 谢谢,是的,这是我犯的主要错误。不使用 @Configuration 创建的 bean spring boot。而且它似乎对命名很敏感,所以我不得不将 example-unit.confi-list: 添加到 yaml 文件的标题中,以便它通过名称识别列表,因此它可以使用配置中的值对其进行实例化。
    【解决方案2】:

    将您的列表放在 prefix.property 下。在你的情况下example-unit.confi-list:。通常为您的属性提供一个 setter:setConfiList(List&lt;String&gt; strings)。但是由于您已经将它初始化为空数组列表,所以这个 setter 已经过时了,说this。也有建议将 Enable-annotation 添加到 Application 类:

    应用程序类应该有 @EnableConfigurationProperties 注释

    【讨论】:

    • 试过了,它仍然返回一个空列表,但感谢您的回答。
    【解决方案3】:

    这是Spring Bboot Configurtion Binding 工作原理的参考。

    专门针对您的问题,这是一个实现您目标的应用示例:

    • application.yml
    example-unit:
      confiList:
        - string1
        - string2
        - hello22
    
    • 来源
    @SpringBootApplication
    @EnableConfigurationProperties(ConfigurationUnit.class)
    public class DemoApplication {
    
        public static void main(String[] args) {
            ConfigurableApplicationContext context = SpringApplication.run(DemoApplication.class, args);
            ConfigurationUnit configurationUnit = context.getBean(ConfigurationUnit.class);
            System.out.println(configurationUnit.getConfiList());
        }
    
    }
    
    @ConfigurationProperties("example-unit")
    public class ConfigurationUnit {
    
        public List<String> confiList = new ArrayList<>();
    
        public List<String> getConfiList() {
            return this.confiList;
        }
    
    }
    

    【讨论】:

      【解决方案4】:

      这是一个例子:

      Application.yml:

      example-unit: string1,string2,hello22
      

      ConfigurationUnit.class:

      @Component
      @PropertySource(value="classpath:application.yml")
      public class ConfigurationUnit {
      
          @Value("#{'${example-unit}'.split(',')}")
          private List<String> confiList;
      
          public List<String> getConfiList() {
              return confiList;
          }
      }
      

      DemoFileLoadApplication.class:

      @SpringBootApplication
      public class DemoFileLoadApplication {
      
          public static void main(String[] args) {
              ConfigurableApplicationContext context = SpringApplication.run(DemoFileLoadApplication.class, args);
              ConfigurationUnit configurationUnit = context.getBean(ConfigurationUnit.class);
              System.out.println(configurationUnit.getConfiList());
          }
      }
      

      输出:

      [string1, string2, hello22]

      【讨论】:

        猜你喜欢
        • 2022-10-25
        • 2021-07-11
        • 2022-06-15
        • 1970-01-01
        • 1970-01-01
        • 2021-06-27
        • 2020-06-15
        • 2018-01-02
        • 2016-01-17
        相关资源
        最近更新 更多