【问题标题】:How to map YAML file data into multiple java models?如何将 YAML 文件数据映射到多个 java 模型中?
【发布时间】:2021-10-30 12:15:15
【问题描述】:

如何将数据从单个 YAML 文件映射到多个 bean 对象?我正在使用 snakeyaml

**variables.yml:**
Apple:
   A1: a1
   A2: a2
Mango:
   M1: m1
   M2: m2

**Java Model Classes:**
Apple apple = new Apple(a1, a2);
Mango mango = new Mango(m1, m2);
Fruit fruit = new Fruit(apple, mango);

现在我可以得到如下个人数据:

InputStream inputStream = new FileInputStream(new File("variables.yaml"));
        Yaml yaml = new Yaml();
        Map<String, Object> yamlMaps = yaml.load(inputStream);
        Map<String, Object> appleData = (Map<String, Object>) yamlMaps.get("Header");
        Map<String, Object> mangoData = (Map<String, Object>) yamlMaps.get("Content");

但我想将这些数据加载到 Fruit 对象中。

【问题讨论】:

  • 您阅读过文档吗? bitbucket.org/asomov/snakeyaml/wiki/…
  • @tgdavies 是的!我尝试使用 TypeDescription,但它给出了一个错误:“Cannot create property=Header for JavaBean=Fruit”

标签: java spring-boot yaml


【解决方案1】:

您的问题的简短答案是使用 spring-boot 中的@ConfigurationProperties


使用@ConfigurationProperties的示例代码

SampleApplication.java

@SpringBootApplication
public class SampleApplication implements CommandLineRunner {

    @Autowired
    Fruit fruit;

    @Override
    public void run(String... args) throws Exception {
        System.out.println(fruit);
    }

    public static void main(String[] args) {
        SpringApplication.run(SampleApplication.class, args);
    }
}

Fruit.java

@Component
@ConfigurationProperties
public class Fruit {

    @JsonProperty("apple")
    Apple apple;

    @JsonProperty("mango")
    Mango mango;

    public Fruit() {
    }

    // getters, setters

    @Override
    public String toString() {
        return "Fruit{" +
                "apple=" + apple +
                ", mango=" + mango +
                '}';
    }
}

Apple.java

public class Apple {

    @JsonProperty("A1")
    String A1;

    @JsonProperty("A2")
    String A2;

    // getters, setters, toString...

Mango.java

public class Mango {

    @JsonProperty("M1")
    String M1;

    @JsonProperty("M2")
    String M2;

    public Mango() {
    }

    public Mango(String m1, String m2) {
        M1 = m1;
        M2 = m2;
    }
    // constructors, getters, setters, toString...

application.yml

apple:
  A1: a1
  A2: a2
mango:
  M1: m1
  M2: m2

运行应用程序后,我得到了以下结果。

...
Fruit{apple=Apple{A1='a1', A2='a2'}, mango=Mango{M1='m1', M2='m2'}}
...

【讨论】:

  • Saravanakrishnan Pk ::: 你是如何加载 yml 文件的?你为 Fruit 类设置了 TypeDescription 吗?
猜你喜欢
  • 2020-10-07
  • 1970-01-01
  • 2010-12-17
  • 2018-06-19
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
相关资源
最近更新 更多