Java и YAML: как проанализировать несколько документов yaml и объединить их в одно представление YAML?

Допустим, у меня есть один файл, defaults.yaml:

pool:
  idleConnectionTestPeriodSeconds: 30
  idleMaxAgeInMinutes: 60
  partitionCount: 4
  acquireIncrement: 5
  username: dev
  password: dev_password

и еще один файл, production.yaml:

pool:
  username: prod
  password: prod_password

Как во время выполнения прочитать оба файла и объединить их в один, чтобы приложение «видело» следующее?

pool:
  idleConnectionTestPeriodSeconds: 30
  idleMaxAgeInMinutes: 60
  partitionCount: 4
  acquireIncrement: 5
  username: prod
  password: prod_password

Возможно ли это, скажем, со SnakeYAML? Любые другие инструменты?

Я знаю, что один из вариантов — прочитать несколько файлов в виде карт, а затем объединить их самостоятельно, преобразовать слияние в один временный файл и затем прочитать его, но это тяжелое решение. Может ли существующий инструмент сделать это уже?


person Les Hazlewood    schedule 13.10.2014    source источник
comment
Я не думаю, что существующий инструмент будет делать что-то менее «тяжеловесное», чем то, что вы думаете сделать — другой вариант — пропустить временный файл и просто объединить карты в памяти.   -  person spirulence    schedule 22.01.2015


Ответы (1)


Вы можете использовать Джексона, ключ использует ObjectMapper.readerForUpdating() и аннотировать поле с помощью @JsonMerge (или все отсутствующие поля в следующих объектах перезапишут старое) :

Мейвен:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.9</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-yaml</artifactId>
        <version>2.9.9</version>
    </dependency>

Код:

public class TestJackson {
    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
        MyConfig myConfig = new MyConfig();
        ObjectReader objectReader = mapper.readerForUpdating(myConfig);
        objectReader.readValue(new File("misc/a.yaml"));
        objectReader.readValue(new File("misc/b.yaml"));
        System.out.println(myConfig);
    }

    @Data
    public static class MyConfig {
        @JsonMerge
        private Pool pool;
    }

    @Data
    public static class Pool {
        private Integer idleConnectionTestPeriodSeconds;
        private Integer idleMaxAgeInMinutes;
        private Integer partitionCount;
        private Integer acquireIncrement;
        private String username;
        private String password;
    }
}
person yelliver    schedule 24.07.2019
comment
Окончательно! Ответ через пять лет!!! :) Это все еще ценится - ответ присуждается. Благодарю вас! - person Les Hazlewood; 24.07.2019