From b3878e84ae3dc65148fb2f80514140daafca0afb Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 29 Nov 2022 11:21:24 +0100 Subject: [PATCH] Fix bug where using a YAML with anchors couldn't be loaded Closes gh-33404 --- .../boot/env/OriginTrackedYamlLoader.java | 6 ++++-- .../boot/env/OriginTrackedYamlLoaderTests.java | 9 +++++++++ .../resources/org/springframework/boot/env/anchors.yml | 6 ++++++ 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/anchors.yml diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java index a80b63d0df9b..273e7914187c 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java @@ -79,7 +79,7 @@ private Yaml createYaml(LoaderOptions loaderOptions) { } List> load() { - final List> result = new ArrayList<>(); + List> result = new ArrayList<>(); process((properties, map) -> result.add(getFlattenedMap(map))); return result; } @@ -119,7 +119,9 @@ protected Object constructObject(Node node) { } private void replaceMappingNodeKeys(MappingNode node) { - node.setValue(node.getValue().stream().map(KeyScalarNode::get).toList()); + List newValue = new ArrayList<>(); + node.getValue().stream().map(KeyScalarNode::get).forEach(newValue::add); + node.setValue(newValue); } private Object constructTrackedObject(Node node, Object value) { diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedYamlLoaderTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedYamlLoaderTests.java index 874dfaaf0cdb..f160bdd59ff0 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedYamlLoaderTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedYamlLoaderTests.java @@ -173,6 +173,15 @@ void loadWhenRecursiveLoadsYaml() { assertThat(loaded.get("test.b.boot")).hasToString("b"); } + @Test + void loadWhenUsingAnchors() { + Resource resource = new ClassPathResource("anchors.yml", getClass()); + this.loader = new OriginTrackedYamlLoader(resource); + Map loaded = this.loader.load().get(0); + assertThat(loaded.get("some.path.config.key")).hasToString("value"); + assertThat(loaded.get("some.anotherpath.config.key")).hasToString("value"); + } + private OriginTrackedValue getValue(String name) { if (this.result == null) { this.result = this.loader.load(); diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/anchors.yml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/anchors.yml new file mode 100644 index 000000000000..302131220c7e --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/anchors.yml @@ -0,0 +1,6 @@ +some: + path: &anchor + config: + key: value + anotherpath: + <<: *anchor