Keep YAML entries that haven an empty array value

Prior to this commit, a YAML entry that define an empty array value was
lost. This commit makes sure to flag it with an empty String, which
corresponds as an empty comma separated list of entries in the
properties format.

Issue: SPR-16769
This commit is contained in:
Stephane Nicoll 2018-04-29 10:29:47 +02:00
parent 2bd3b534fb
commit e51330e905
3 changed files with 34 additions and 6 deletions

View File

@ -293,10 +293,14 @@ public abstract class YamlProcessor {
// Need a compound key
@SuppressWarnings("unchecked")
Collection<Object> collection = (Collection<Object>) value;
int count = 0;
for (Object object : collection) {
buildFlattenedMap(result,
Collections.singletonMap("[" + (count++) + "]", object), key);
if (collection.isEmpty()) {
result.put(key, "");
} else {
int count = 0;
for (Object object : collection) {
buildFlattenedMap(result, Collections.singletonMap(
"[" + (count++) + "]", object), key);
}
}
}
else {

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2017 the original author or authors.
* Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -19,6 +19,7 @@ package org.springframework.beans.factory.config;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
@ -116,6 +117,20 @@ public class YamlMapFactoryBeanTests {
assertEquals(Integer.valueOf(3), sub.get("key1.key2"));
}
@Test
public void mapWithEmptyArrayValue() {
this.factory.setResources(new ByteArrayResource("a: alpha\ntest: []".getBytes()));
assertTrue(this.factory.getObject().containsKey("test"));
assertEquals(((List<?>)this.factory.getObject().get("test")).size(), 0);
}
@Test
public void mapWithEmptyValue() {
this.factory.setResources(new ByteArrayResource("a: alpha\ntest:".getBytes()));
assertTrue(this.factory.getObject().containsKey("test"));
assertNull(this.factory.getObject().get("test"));
}
@Test
public void testDuplicateKey() throws Exception {
this.factory.setResources(new ByteArrayResource("mymap:\n foo: bar\nmymap:\n bar: foo".getBytes()));

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2017 the original author or authors.
* Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -207,6 +207,15 @@ public class YamlPropertiesFactoryBeanTests {
assertThat(properties.getProperty("spam"), equalTo(""));
}
@Test
public void testLoadEmptyArrayValue() {
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(new ByteArrayResource("a: alpha\ntest: []".getBytes()));
Properties properties = factory.getObject();
assertThat(properties.getProperty("a"), equalTo("alpha"));
assertThat(properties.getProperty("test"), equalTo(""));
}
@Test
public void testLoadArrayOfString() throws Exception {
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();