Skip to content

Commit 8c1d742

Browse files
christophstroblmp911de
authored andcommitted
Consider null value settings for types with custom conversion.
This commit fixes an issue where settings regarding storage of null values had been ignored if a custom converter took care of the conversion.
1 parent 680d49c commit 8c1d742

File tree

3 files changed

+66
-3
lines changed

3 files changed

+66
-3
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DocumentAccessor.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,4 +172,21 @@ private static Document getOrCreateNestedDocument(String key, Bson source) {
172172

173173
return nested;
174174
}
175+
176+
DocumentAccessor withCheckFieldMapping(boolean checkFieldMapping) {
177+
178+
if(!checkFieldMapping) {
179+
return this;
180+
}
181+
182+
return new DocumentAccessor(this.document) {
183+
@Override
184+
public void put(MongoPersistentProperty prop, @Nullable Object value) {
185+
if(value != null || prop.writeNullValues()) {
186+
super.put(prop, value);
187+
}
188+
}
189+
};
190+
191+
}
175192
}

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1284,7 +1284,8 @@ private void writeSimpleInternal(@Nullable Object value, Bson bson, String key)
12841284

12851285
private void writeSimpleInternal(@Nullable Object value, Bson bson, MongoPersistentProperty property,
12861286
PersistentPropertyAccessor<?> persistentPropertyAccessor) {
1287-
DocumentAccessor accessor = new DocumentAccessor(bson);
1287+
1288+
DocumentAccessor accessor = new DocumentAccessor(bson).withCheckFieldMapping(true);
12881289

12891290
if (conversions.hasValueConverter(property)) {
12901291
accessor.put(property, conversions.getPropertyValueConversions().getValueConverter(property).write(value,

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
import org.springframework.data.annotation.PersistenceConstructor;
6464
import org.springframework.data.annotation.Transient;
6565
import org.springframework.data.annotation.TypeAlias;
66+
import org.springframework.data.convert.ConverterBuilder;
6667
import org.springframework.data.convert.CustomConversions;
6768
import org.springframework.data.convert.PropertyValueConverter;
6869
import org.springframework.data.convert.PropertyValueConverterFactory;
@@ -2693,6 +2694,44 @@ void shouldWriteNullPropertyCorrectly() {
26932694
converter.write(fieldWrite, document);
26942695

26952696
assertThat(document).containsEntry("writeAlways", null).doesNotContainKey("writeNonNull");
2697+
assertThat(document).containsEntry("writeAlwaysPersonDBRef", null).doesNotContainKey("writeNonNullPersonDBRef");
2698+
}
2699+
2700+
@Test // GH-4710
2701+
void shouldWriteSimplePropertyCorrectlyAfterConversionReturnsNull() {
2702+
2703+
MongoCustomConversions conversions = new MongoCustomConversions(ConverterBuilder.writing(Integer.class, String.class, it -> null).andReading(it -> null).getConverters().stream().toList());
2704+
2705+
converter = new MappingMongoConverter(resolver, mappingContext);
2706+
converter.setCustomConversions(conversions);
2707+
converter.afterPropertiesSet();
2708+
2709+
WithFieldWrite fieldWrite = new WithFieldWrite();
2710+
fieldWrite.writeAlways = 10;
2711+
fieldWrite.writeNonNull = 20;
2712+
2713+
org.bson.Document document = new org.bson.Document();
2714+
converter.write(fieldWrite, document);
2715+
2716+
assertThat(document).containsEntry("writeAlways", null).doesNotContainKey("writeNonNull");
2717+
}
2718+
2719+
@Test // GH-4710
2720+
void shouldWriteComplexPropertyCorrectlyAfterConversionReturnsNull() {
2721+
2722+
MongoCustomConversions conversions = new MongoCustomConversions(ConverterBuilder.writing(Person.class, String.class, it -> null).andReading(it -> null).getConverters().stream().toList());
2723+
2724+
converter = new MappingMongoConverter(resolver, mappingContext);
2725+
converter.setCustomConversions(conversions);
2726+
converter.afterPropertiesSet();
2727+
2728+
WithFieldWrite fieldWrite = new WithFieldWrite();
2729+
fieldWrite.writeAlwaysPerson = new Person();
2730+
fieldWrite.writeNonNullPerson = new Person();
2731+
2732+
org.bson.Document document = new org.bson.Document();
2733+
converter.write(fieldWrite, document);
2734+
26962735
assertThat(document).containsEntry("writeAlwaysPerson", null).doesNotContainKey("writeNonNullPerson");
26972736
}
26982737

@@ -4102,13 +4141,19 @@ static class WithFieldWrite {
41024141
@org.springframework.data.mongodb.core.mapping.Field(
41034142
write = org.springframework.data.mongodb.core.mapping.Field.Write.ALWAYS) Integer writeAlways;
41044143

4144+
@org.springframework.data.mongodb.core.mapping.Field(
4145+
write = org.springframework.data.mongodb.core.mapping.Field.Write.NON_NULL) Person writeNonNullPerson;
4146+
4147+
@org.springframework.data.mongodb.core.mapping.Field(
4148+
write = org.springframework.data.mongodb.core.mapping.Field.Write.ALWAYS) Person writeAlwaysPerson;
4149+
41054150
@org.springframework.data.mongodb.core.mapping.DBRef
41064151
@org.springframework.data.mongodb.core.mapping.Field(
4107-
write = org.springframework.data.mongodb.core.mapping.Field.Write.NON_NULL) Person writeNonNullPerson;
4152+
write = org.springframework.data.mongodb.core.mapping.Field.Write.NON_NULL) Person writeNonNullPersonDBRef;
41084153

41094154
@org.springframework.data.mongodb.core.mapping.DBRef
41104155
@org.springframework.data.mongodb.core.mapping.Field(
4111-
write = org.springframework.data.mongodb.core.mapping.Field.Write.ALWAYS) Person writeAlwaysPerson;
4156+
write = org.springframework.data.mongodb.core.mapping.Field.Write.ALWAYS) Person writeAlwaysPersonDBRef;
41124157

41134158
}
41144159

0 commit comments

Comments
 (0)