From 4378669d3358ab0168ff7773ce43b716885029db Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 21 May 2019 12:20:45 +0200 Subject: [PATCH] DATAREDIS-955 - Fix collection initialization when reading nested structures with same name. We now make sure to not falsely populate instances with null values from nested structures. Original pull request: #452. --- .../data/redis/core/convert/Bucket.java | 2 +- .../core/convert/ConversionTestEntities.java | 11 ++++++++ .../MappingRedisConverterUnitTests.java | 27 +++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/redis/core/convert/Bucket.java b/src/main/java/org/springframework/data/redis/core/convert/Bucket.java index a57a10614..fd97270e6 100644 --- a/src/main/java/org/springframework/data/redis/core/convert/Bucket.java +++ b/src/main/java/org/springframework/data/redis/core/convert/Bucket.java @@ -158,7 +158,7 @@ public class Bucket { return keySet(); } - Pattern pattern = Pattern.compile("(" + Pattern.quote(path) + ")\\.\\[.*?\\]"); + Pattern pattern = Pattern.compile("^(" + Pattern.quote(path) + ")\\.\\[.*?\\]"); Set keys = new LinkedHashSet(); for (Map.Entry entry : data.entrySet()) { diff --git a/src/test/java/org/springframework/data/redis/core/convert/ConversionTestEntities.java b/src/test/java/org/springframework/data/redis/core/convert/ConversionTestEntities.java index e1c74e6f9..a1a687800 100644 --- a/src/test/java/org/springframework/data/redis/core/convert/ConversionTestEntities.java +++ b/src/test/java/org/springframework/data/redis/core/convert/ConversionTestEntities.java @@ -192,4 +192,15 @@ public class ConversionTestEntities { Map decimalMapKeyMapping; Map dateMapKeyMapping; } + + static class Outer { + + List inners; + List values; + } + + static class Inner { + + List values; + } } diff --git a/src/test/java/org/springframework/data/redis/core/convert/MappingRedisConverterUnitTests.java b/src/test/java/org/springframework/data/redis/core/convert/MappingRedisConverterUnitTests.java index e508795e4..8a5e21f9b 100644 --- a/src/test/java/org/springframework/data/redis/core/convert/MappingRedisConverterUnitTests.java +++ b/src/test/java/org/springframework/data/redis/core/convert/MappingRedisConverterUnitTests.java @@ -1752,6 +1752,33 @@ public class MappingRedisConverterUnitTests { assertThat(write(update).getBucket().get("_class"), is(nullValue())); } + + @Test // DATAREDIS-955 + public void readInnerListShouldNotInfluenceOuterWithSameName() { + + Map source = new LinkedHashMap(); + source.put("inners.[0].values.[0]", "i-1"); + source.put("inners.[0].values.[1]", "i-2"); + source.put("values.[0]", "o-1"); + source.put("values.[1]", "o-2"); + + Outer outer = read(Outer.class, source); + assertThat(outer.values, is(equalTo(Arrays.asList("o-1", "o-2")))); + assertThat(outer.inners.get(0).values, is(equalTo(Arrays.asList("i-1", "i-2")))); + } + + @Test // DATAREDIS-955 + public void readInnerListShouldNotInfluenceOuterWithSameNameWhenNull() { + + Map source = new LinkedHashMap(); + source.put("inners.[0].values.[0]", "i-1"); + source.put("inners.[0].values.[1]", "i-2"); + + Outer outer = read(Outer.class, source); + assertThat(outer.values, is(nullValue())); + assertThat(outer.inners.get(0).values, is(equalTo(Arrays.asList("i-1", "i-2")))); + } + private RedisData write(Object source) { RedisData rdo = new RedisData();