【问题标题】:Spring Boot yaml nested property map to Configuration class HashMapSpring Boot yaml 嵌套属性映射到配置类 HashMap
【发布时间】:2017-05-18 06:53:46
【问题描述】:

我有一个名为 CommonConfig 的配置类,到目前为止它运行良好……

@Data
@Component
@ConfigurationProperties(prefix = “my")
public class CommonConfig {
  private String foo;
  private String bar;
  private SubA subA;

  @Data 
  public static class SubA {
    private String baz;
    private SubB subB;

    @Data 
    public static class SubB {
      private String qux;
    }
  }
}

还有Yaml property 文件:

my.foo: a
my.bar: b
my.sub-a.baz: c
my.sub-a.sub-b.qux: d

当我想将map 放入 SubB 时,我的问题就开始了:

my:
  foo: a
  bar: b
  sub-a:
    baz: c
    sub-b:
      qux: d
      map:
        number-one: 1
        number-two: 2
        number-three: 3

我尝试在我的 SubB 类中添加一个简单的地图声明:

...
@Data 
public static class SubB {
  private String qux;
  private Map<String, Integer> map = new HashMap<>();
}

当我运行它时,所有其他属性都在配置中,但地图是空的。 我也尝试过不初始化地图,但它仍然为空。

我的@SpringBootApplication 类之前只使用了一个注释就可以正常工作。基于其他一些 StackOverflow 问题,我尝试添加 @EnableConfigurationProperties,但没有任何区别。

【问题讨论】:

  • 为我工作。如果您发布完整项目的链接,我们可能会看到您没有告诉我们的内容。
  • 非常感谢您的检查!我按照描述制作了示例,它也对我有用,所以我开始移植我的实际应用程序,看看有什么不同。这一切都归结为不读取属性文件,因为应用程序名称不匹配。将另一个错误归结为 PEBKAC 或 ID-10-T 错误。 ://

标签: spring-boot yaml


【解决方案1】:
  1. 如果是 YAML 文件,application.yml会自动加载。如果文件名是其他名称,Spring 不会自动加载它。
  2. @PropertySource 自 SprintBoot 2.1 起不适用于 YAML
  3. 如果 YAML 文件需要不同的名称,我们需要设置 spring.config.namespring.config.location
    https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-yaml
  4. 以下链接也指向了一个很好的答案:
    Reading a map from yaml in Java getting null

【讨论】:

    【解决方案2】:

    这个例子确实很好用。我的特殊问题是没有被读取的配置文件。

    【讨论】:

      猜你喜欢
      • 2016-09-08
      • 2020-10-22
      • 1970-01-01
      • 2019-07-08
      • 2019-08-09
      • 1970-01-01
      • 2020-05-31
      • 2022-06-28
      • 2017-02-17
      相关资源
      最近更新 更多