From 785eabfaceb8677c1d8ceff1de086bb25d3c7aeb Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 24 Nov 2023 14:48:39 +0100 Subject: [PATCH] Fix NPE when traversing map. We now use regular iteration instead of the Stream API. Closes: #4567 Original pull request: #4568 --- .../data/mongodb/core/convert/QueryMapper.java | 6 +++--- .../mongodb/core/convert/UpdateMapperUnitTests.java | 12 ++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java index 06aee31af..b615ba768 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java @@ -607,11 +607,11 @@ public class QueryMapper { return source; } - if (source instanceof Map) { + if (source instanceof Map sourceMap) { - Map map = new LinkedHashMap<>(); + Map map = new LinkedHashMap<>(sourceMap.size(), 1F); - ((Map) source).entrySet().forEach(it -> { + sourceMap.entrySet().forEach(it -> { String key = ObjectUtils.nullSafeToString(converter.convertToMongoType(it.getKey())); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/UpdateMapperUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/UpdateMapperUnitTests.java index 8dc250fa6..f13a1b71b 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/UpdateMapperUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/UpdateMapperUnitTests.java @@ -768,6 +768,18 @@ class UpdateMapperUnitTests { assertThat(mappedUpdate).doesNotContainKey("$set.concreteMap.jasnah._class"); } + @Test // GH-4567 + void updateShouldAllowNullValuesInMap() { + + Map map = Collections.singletonMap("jasnah", new NestedDocument("kholin")); + + Update update = new Update().set("concreteMap", Collections.singletonMap("jasnah", null)); + Document mappedUpdate = mapper.getMappedObject(update.getUpdateObject(), + context.getPersistentEntity(EntityWithObjectMap.class)); + + assertThat(mappedUpdate).isEqualTo(new Document("$set", new Document("concreteMap", Collections.singletonMap("jasnah", null)))); + } + @Test // DATAMONGO-1250 @SuppressWarnings("unchecked") void mapsUpdateWithBothReadingAndWritingConverterRegistered() {