Skip to content

Commit a702fdc

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 a702fdc

File tree

2 files changed

+44
-6
lines changed

2 files changed

+44
-6
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 & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
import org.mockito.Mock;
5252
import org.mockito.Mockito;
5353
import org.mockito.junit.jupiter.MockitoExtension;
54-
5554
import org.springframework.aop.framework.ProxyFactory;
5655
import org.springframework.beans.ConversionNotSupportedException;
5756
import org.springframework.beans.factory.annotation.Autowired;
@@ -108,6 +107,7 @@
108107
import org.springframework.lang.NonNull;
109108
import org.springframework.lang.Nullable;
110109
import org.springframework.test.util.ReflectionTestUtils;
110+
import org.springframework.util.ObjectUtils;
111111

112112
import com.mongodb.BasicDBList;
113113
import com.mongodb.BasicDBObject;
@@ -3410,11 +3410,38 @@ void usesStringNumericFormat() {
34103410
assertThat(document).containsEntry("map.foo", "2.5");
34113411
}
34123412

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

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

34193446
MongoMappingContext mappingContext = new MongoMappingContext();
34203447
mappingContext.setApplicationContext(context);
@@ -3437,6 +3464,14 @@ org.bson.Document write(Object source) {
34373464
return target;
34383465
}
34393466

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

34423477
Vector embeddings;
@@ -4084,8 +4119,7 @@ static class WithExplicitTargetTypes {
40844119
@Field(targetType = FieldType.DECIMAL128) //
40854120
BigDecimal bigDecimal;
40864121

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

40904124
@Field(targetType = FieldType.INT64) //
40914125
Date dateAsLong;
@@ -4100,6 +4134,10 @@ static class WithExplicitTargetTypes {
41004134
Date dateAsObjectId;
41014135
}
41024136

4137+
static class WithBigNumericValues {
4138+
BigInteger bigInteger;
4139+
}
4140+
41034141
static class WrapperAroundWithUnwrapped {
41044142

41054143
String someValue;

0 commit comments

Comments
 (0)