From 161a983c5d3d64f9c7f5bed41364805566e4a7f6 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 e8578a8bf..3a10a6c9a 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 @@ -982,6 +982,7 @@ public class QueryMapper { * @param pathExpression * @return */ + @Nullable private PersistentPropertyPath getPath(String pathExpression) { try { @@ -1007,7 +1008,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; + + } + }