From 078e14698373b9093d9637713fa36614e210a1ce Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Tue, 23 Jun 2020 16:50:00 -0700 Subject: [PATCH] Filter empty YAML documents Update `OriginTrackedYamlLoader` so that empty documents are filtered from the result. Prior to this commit, our origin wrapper would confuse the YAML processor and cause empty documents to be included in the Map with a key of "document" and no value. Closes gh-22493 --- .../boot/env/OriginTrackedYamlLoader.java | 10 ++++++++++ .../boot/env/OriginTrackedYamlLoaderTests.java | 7 +++++++ .../org/springframework/boot/env/test-empty-yaml.yml | 5 +++++ 3 files changed, 22 insertions(+) create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-empty-yaml.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 ce92ea842c..30959fab34 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 @@ -19,6 +19,7 @@ package org.springframework.boot.env; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.NoSuchElementException; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -82,6 +83,15 @@ class OriginTrackedYamlLoader extends YamlProcessor { */ private class OriginTrackingConstructor extends SafeConstructor { + @Override + public Object getData() throws NoSuchElementException { + Object data = super.getData(); + if (data instanceof CharSequence && ((CharSequence) data).length() == 0) { + return null; + } + return data; + } + @Override protected Object constructObject(Node node) { if (node instanceof ScalarNode) { 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 480759c179..b26cb73866 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 @@ -128,6 +128,13 @@ class OriginTrackedYamlLoaderTests { assertThatExceptionOfType(ConstructorException.class).isThrownBy(this.loader::load); } + @Test + void emptyDocumentes() { + this.loader = new OriginTrackedYamlLoader(new ClassPathResource("test-empty-yaml.yml", getClass())); + List> loaded = this.loader.load(); + assertThat(loaded).isEmpty(); + } + 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/test-empty-yaml.yml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-empty-yaml.yml new file mode 100644 index 0000000000..783019e761 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-empty-yaml.yml @@ -0,0 +1,5 @@ +--- +--- + +--- +--- \ No newline at end of file