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.
This commit is contained in:
Christoph Strobl
2019-01-09 08:29:06 +01:00
committed by Mark Paluch
parent 723b481f82
commit 273088b6a8
2 changed files with 23 additions and 1 deletions

View File

@@ -958,6 +958,7 @@ public class QueryMapper {
* @param pathExpression
* @return
*/
@Nullable
private PersistentPropertyPath<MongoPersistentProperty> getPath(String pathExpression) {
try {
@@ -983,7 +984,7 @@ public class QueryMapper {
}
return propertyPath;
} catch (PropertyReferenceException e) {
} catch (PropertyReferenceException | InvalidPersistentPropertyPath e) {
return null;
}
}

View File

@@ -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;
}
}