diff --git a/pom.xml b/pom.xml
index 366786fc6d..5fe46fcc0a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-mongodb-parent
- 4.2.0-SNAPSHOT
+ 4.2.x-4502-SNAPSHOT
pom
Spring Data MongoDB
diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml
index 2de4b6b635..90e4b7e7a6 100644
--- a/spring-data-mongodb-benchmarks/pom.xml
+++ b/spring-data-mongodb-benchmarks/pom.xml
@@ -7,7 +7,7 @@
org.springframework.data
spring-data-mongodb-parent
- 4.2.0-SNAPSHOT
+ 4.2.x-4502-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml
index 41b81f9aa6..45475aab9e 100644
--- a/spring-data-mongodb-distribution/pom.xml
+++ b/spring-data-mongodb-distribution/pom.xml
@@ -15,7 +15,7 @@
org.springframework.data
spring-data-mongodb-parent
- 4.2.0-SNAPSHOT
+ 4.2.x-4502-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml
index d7a9ddaa63..52bac214d2 100644
--- a/spring-data-mongodb/pom.xml
+++ b/spring-data-mongodb/pom.xml
@@ -13,7 +13,7 @@
org.springframework.data
spring-data-mongodb-parent
- 4.2.0-SNAPSHOT
+ 4.2.x-4502-SNAPSHOT
../pom.xml
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 06aee31afc..1c4e4bb762 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
@@ -1471,26 +1471,29 @@ protected String mapPropertyName(MongoPersistentProperty property) {
}
String nextToken = nextToken();
- if (isPositionalParameter(nextToken)) {
+ if (property.isMap()) {
mappedName.append(".").append(nextToken);
currentIndex += 2;
return mappedName.toString();
}
- if (property.isMap()) {
-
+ int i = 1;
+ while (isPositionalParameter(nextToken)) {
mappedName.append(".").append(nextToken);
- currentIndex += 2;
- return mappedName.toString();
+ i++;
+ nextToken = currentIndex + i < pathParts.size() ? pathParts.get(currentIndex + i) : "";
}
-
- currentIndex++;
+ currentIndex += i;
return mappedName.toString();
}
static boolean isPositionalParameter(String partial) {
+ if(!StringUtils.hasText(partial)) {
+ return false;
+ }
+
if ("$".equals(partial)) {
return true;
}
@@ -1500,12 +1503,12 @@ static boolean isPositionalParameter(String partial) {
return true;
}
- try {
- Long.valueOf(partial);
- return true;
- } catch (NumberFormatException e) {
- return false;
+ for (int i = 0; i < partial.length(); i++) {
+ if (!Character.isDigit(partial.charAt(i))) {
+ return false;
+ }
}
+ return true;
}
}
}
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 df1e13aeae..5d8629a5b4 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
@@ -1350,6 +1350,17 @@ void updateConsidersValueConverterWhenPresent() {
assertThat(mappedUpdate).isEqualTo("{ $set : { 'text' : 'eulav' } }");
}
+ @ParameterizedTest // GH-4502
+ @ValueSource(strings = {"levelOne.levelTwo.1", "levelOne.levelTwo.1.0", "levelOne.levelTwo.2.0",})
+ void objectNestedIntegerFieldCorrectly(String path) {
+
+ Update update = new Update().set(path, "4");
+ Document mappedUpdate = mapper.getMappedObject(update.getUpdateObject(),
+ context.getPersistentEntity(EntityWithNestedObject1.class));
+
+ assertThat(mappedUpdate).isEqualTo(new org.bson.Document("$set", new org.bson.Document(path, "4")));
+ }
+
static class DomainTypeWrappingConcreteyTypeHavingListOfInterfaceTypeAttributes {
ListModelWrapper concreteTypeWithListAttributeOfInterfaceType;
}
@@ -1818,4 +1829,12 @@ static class WithPropertyValueConverter {
@ValueConverter(ReversingValueConverter.class)
String text;
}
+
+ static class EntityWithNestedObject1 {
+ EntityWithNestedObject2 levelOne;
+ }
+
+ static class EntityWithNestedObject2 {
+ Integer levelTwo;
+ }
}