From e52b5d4b91b7565acb400a66046489158a085437 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 22 Aug 2018 11:14:19 +0200 Subject: [PATCH] DATAMONGO-2066 - Skip immutable fields on property population. We now skip immutable fields without withers on property population as they by definition have to be populated though the constructor and cannot be mutated afterwards. --- .../core/convert/MappingMongoConverter.java | 4 +++ .../MappingMongoConverterUnitTests.java | 30 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java index 9b8ce5563..83ebdb59e 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java @@ -363,6 +363,10 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App continue; } + if (prop.isImmutable() && prop.getWither() == null) { + continue; + } + if (entity.isConstructorArgument(prop) || !documentAccessor.hasValue(prop)) { continue; } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java index 1f8b8873f..32a15788f 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java @@ -26,7 +26,9 @@ import static org.junit.Assert.fail; import static org.mockito.Mockito.*; import static org.springframework.data.mongodb.core.DocumentTestUtils.*; +import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor; +import lombok.experimental.Wither; import java.math.BigDecimal; import java.math.BigInteger; @@ -1913,6 +1915,20 @@ public class MappingMongoConverterUnitTests { assertThat(target).doesNotContainKeys("_class"); } + @Test // DATAMONGO-2066 + public void doesNotPopulateImmutableFieldEvenIfInDocument() { + + org.bson.Document source = new org.bson.Document("first", "foo").append("second", "bar"); + + SampleWithImmutableField result = converter.read(SampleWithImmutableField.class, source); + + // No wither, no change… think Bob Marley. + assertThat(result.first).isEqualTo("first"); + + // Wither used + assertThat(result.second).isEqualTo("bar"); + } + static class GenericType { T content; } @@ -2341,4 +2357,18 @@ public class MappingMongoConverterUnitTests { final @Id String id; String value; } + + // DATAMONGO-2066 + + @AllArgsConstructor + static class SampleWithImmutableField { + + final String first; + final @Wither String second; + + public SampleWithImmutableField() { + this.first = "first"; + this.second = "second"; + } + } }