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 0f23f04b9..2e10214e8 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 @@ -178,7 +178,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 82361e72c..978a261b9 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 @@ -229,4 +229,15 @@ public class ConversionTestEntities { UUID uuid; } + + 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 9135f7805..a9ed7f121 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 @@ -1863,6 +1863,32 @@ public class MappingRedisConverterUnitTests { assertThat(write(source).getBucket(), isBucket().containingUtf8String("uuid", source.uuid.toString())); } + @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();