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 ce92ea842caf..30959fab3488 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 @@ 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 @@ List> load() { */ 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 480759c179e3..b26cb73866b0 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 @@ void unsupportedType() throws Exception { 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 000000000000..783019e76188 --- /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