Skip to content

Commit 2a83087

Browse files
Fix regression in custom conversion ordering.
This commit fixes a regression that prevented user provided custom converters from taking precedence over framework defined ones.
1 parent 4dbc3ea commit 2a83087

File tree

2 files changed

+44
-5
lines changed

2 files changed

+44
-5
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ ConverterConfiguration createConverterConfiguration() {
378378

379379
if (!useNativeDriverJavaTimeCodecs) {
380380

381-
converters.addAll(customConverters);
381+
converters.addAll(0, customConverters); // need to add at index 0!!
382382
return new ConverterConfiguration(STORE_CONVERSIONS, converters, convertiblePair -> true,
383383
this.propertyValueConversions);
384384
}

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

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@
113113
import com.mongodb.BasicDBObject;
114114
import com.mongodb.DBObject;
115115
import com.mongodb.DBRef;
116+
import org.springframework.util.ObjectUtils;
116117

117118
/**
118119
* Unit tests for {@link MappingMongoConverter}.
@@ -3410,11 +3411,38 @@ void usesStringNumericFormat() {
34103411
assertThat(document).containsEntry("map.foo", "2.5");
34113412
}
34123413

3414+
@Test // GH-5036
3415+
void withCustomBigIntegerConversion() {
3416+
3417+
MappingMongoConverter converter = createConverter(MongoCustomConversions.BigDecimalRepresentation.STRING,
3418+
new CustomBigIntegerToStringConverter());
3419+
3420+
WithBigNumericValues container = new WithBigNumericValues();
3421+
container.bigInteger = BigInteger.TEN;
3422+
3423+
org.bson.Document document = new org.bson.Document();
3424+
converter.write(container, document);
3425+
3426+
assertThat(document).containsEntry("bigInteger", "BigInteger('10')");
3427+
}
3428+
34133429
private MappingMongoConverter createConverter(
34143430
MongoCustomConversions.BigDecimalRepresentation bigDecimalRepresentation) {
34153431

3416-
MongoCustomConversions conversions = MongoCustomConversions.create(
3417-
it -> it.registerConverter(new ByteBufferToDoubleHolderConverter()).bigDecimal(bigDecimalRepresentation));
3432+
return createConverter(bigDecimalRepresentation, new ByteBufferToDoubleHolderConverter());
3433+
}
3434+
3435+
private MappingMongoConverter createConverter(
3436+
MongoCustomConversions.BigDecimalRepresentation bigDecimalRepresentation, Converter<?, ?>... customConverters) {
3437+
3438+
MongoCustomConversions conversions = MongoCustomConversions.create(it -> {
3439+
if (!ObjectUtils.isEmpty(customConverters)) {
3440+
for (Converter<?, ?> customConverter : customConverters) {
3441+
it.registerConverter(customConverter);
3442+
}
3443+
}
3444+
it.bigDecimal(bigDecimalRepresentation);
3445+
});
34183446

34193447
MongoMappingContext mappingContext = new MongoMappingContext();
34203448
mappingContext.setApplicationContext(context);
@@ -3437,6 +3465,14 @@ org.bson.Document write(Object source) {
34373465
return target;
34383466
}
34393467

3468+
@WritingConverter
3469+
static class CustomBigIntegerToStringConverter implements Converter<BigInteger, String> {
3470+
@Override
3471+
public String convert(BigInteger source) {
3472+
return "BigInteger('%s')".formatted(source.toString());
3473+
}
3474+
}
3475+
34403476
static class WithVector {
34413477

34423478
Vector embeddings;
@@ -4084,8 +4120,7 @@ static class WithExplicitTargetTypes {
40844120
@Field(targetType = FieldType.DECIMAL128) //
40854121
BigDecimal bigDecimal;
40864122

4087-
@Field(targetType = FieldType.DECIMAL128)
4088-
BigInteger bigInteger;
4123+
@Field(targetType = FieldType.DECIMAL128) BigInteger bigInteger;
40894124

40904125
@Field(targetType = FieldType.INT64) //
40914126
Date dateAsLong;
@@ -4100,6 +4135,10 @@ static class WithExplicitTargetTypes {
41004135
Date dateAsObjectId;
41014136
}
41024137

4138+
static class WithBigNumericValues {
4139+
BigInteger bigInteger;
4140+
}
4141+
41034142
static class WrapperAroundWithUnwrapped {
41044143

41054144
String someValue;

0 commit comments

Comments
 (0)