From 273088b6a8ecec91062c08bd557c6187a22dac4f Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Wed, 9 Jan 2019 08:29:06 +0100 Subject: [PATCH] DATAMONGO-2174 - Fix InvalidPersistentPropertyPath exception when updating documents. MetadataBackedField.getPath() now returns null instead throwing an error for fields that are not part of the domain model. This allows adding any field when updating an entity. Original pull request: #633. --- .../mongodb/core/convert/QueryMapper.java | 3 ++- .../core/convert/UpdateMapperUnitTests.java | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) 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 eb3ecba71..9d2c55fff 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 @@ -958,6 +958,7 @@ public class QueryMapper { * @param pathExpression * @return */ + @Nullable private PersistentPropertyPath getPath(String pathExpression) { try { @@ -983,7 +984,7 @@ public class QueryMapper { } return propertyPath; - } catch (PropertyReferenceException e) { + } catch (PropertyReferenceException | InvalidPersistentPropertyPath e) { return null; } } 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 4618af1bd..36306042c 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 @@ -20,6 +20,7 @@ import static org.springframework.data.mongodb.core.DocumentTestUtils.*; import static org.springframework.data.mongodb.test.util.Assertions.*; import lombok.AllArgsConstructor; +import lombok.Data; import lombok.NoArgsConstructor; import java.time.LocalDate; @@ -979,6 +980,15 @@ public class UpdateMapperUnitTests { .doesNotContainKey("$set.concreteInnerList.[0]._class"); } + @Test // DATAMONGO-2174 + public void mappingUpdateDocumentWithExplicitFieldNameShouldBePossible() { + + Document mappedUpdate = mapper.getMappedObject(new Document("AValue", "a value"), + context.getPersistentEntity(TypeWithFieldNameThatCannotBeDecapitalized.class)); + + assertThat(mappedUpdate).isEqualTo(new Document("AValue", "a value")); + } + static class DomainTypeWrappingConcreteyTypeHavingListOfInterfaceTypeAttributes { ListModelWrapper concreteTypeWithListAttributeOfInterfaceType; } @@ -1291,4 +1301,15 @@ public class UpdateMapperUnitTests { String value; } + @Data + static class TypeWithFieldNameThatCannotBeDecapitalized { + + @Id + protected String id; + + @Field("AValue") + private Long aValue = 0L; + + } + }