Browse Source

Fix regression in custom conversion ordering.

This commit fixes a regression that prevented user provided custom converters from taking precedence over framework defined ones.

Closes: #5036
pull/5137/head
Christoph Strobl 5 months ago
parent
commit
cc912460e0
No known key found for this signature in database
GPG Key ID: E6054036D0C37A4B
  1. 2
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MongoCustomConversions.java
  2. 48
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java

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

@ -378,7 +378,7 @@ public class MongoCustomConversions extends org.springframework.data.convert.Cus @@ -378,7 +378,7 @@ public class MongoCustomConversions extends org.springframework.data.convert.Cus
if (!useNativeDriverJavaTimeCodecs) {
converters.addAll(customConverters);
converters.addAll(0, customConverters); // need to add at index 0!!
return new ConverterConfiguration(STORE_CONVERSIONS, converters, convertiblePair -> true,
this.propertyValueConversions);
}

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

@ -51,7 +51,6 @@ import org.junit.jupiter.params.provider.ValueSource; @@ -51,7 +51,6 @@ import org.junit.jupiter.params.provider.ValueSource;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.beans.ConversionNotSupportedException;
import org.springframework.beans.factory.annotation.Autowired;
@ -108,6 +107,7 @@ import org.springframework.data.util.TypeInformation; @@ -108,6 +107,7 @@ import org.springframework.data.util.TypeInformation;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import org.springframework.test.util.ReflectionTestUtils;
import org.springframework.util.ObjectUtils;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
@ -3410,11 +3410,38 @@ class MappingMongoConverterUnitTests { @@ -3410,11 +3410,38 @@ class MappingMongoConverterUnitTests {
assertThat(document).containsEntry("map.foo", "2.5");
}
@Test // GH-5036
void withCustomBigIntegerConversion() {
MappingMongoConverter converter = createConverter(MongoCustomConversions.BigDecimalRepresentation.STRING,
new CustomBigIntegerToStringConverter());
WithBigNumericValues container = new WithBigNumericValues();
container.bigInteger = BigInteger.TEN;
org.bson.Document document = new org.bson.Document();
converter.write(container, document);
assertThat(document).containsEntry("bigInteger", "BigInteger('10')");
}
private MappingMongoConverter createConverter(
MongoCustomConversions.BigDecimalRepresentation bigDecimalRepresentation) {
MongoCustomConversions conversions = MongoCustomConversions.create(
it -> it.registerConverter(new ByteBufferToDoubleHolderConverter()).bigDecimal(bigDecimalRepresentation));
return createConverter(bigDecimalRepresentation, new ByteBufferToDoubleHolderConverter());
}
private MappingMongoConverter createConverter(
MongoCustomConversions.BigDecimalRepresentation bigDecimalRepresentation, Converter<?, ?>... customConverters) {
MongoCustomConversions conversions = MongoCustomConversions.create(it -> {
if (!ObjectUtils.isEmpty(customConverters)) {
for (Converter<?, ?> customConverter : customConverters) {
it.registerConverter(customConverter);
}
}
it.bigDecimal(bigDecimalRepresentation);
});
MongoMappingContext mappingContext = new MongoMappingContext();
mappingContext.setApplicationContext(context);
@ -3437,6 +3464,14 @@ class MappingMongoConverterUnitTests { @@ -3437,6 +3464,14 @@ class MappingMongoConverterUnitTests {
return target;
}
@WritingConverter
static class CustomBigIntegerToStringConverter implements Converter<BigInteger, String> {
@Override
public String convert(BigInteger source) {
return "BigInteger('%s')".formatted(source.toString());
}
}
static class WithVector {
Vector embeddings;
@ -4084,8 +4119,7 @@ class MappingMongoConverterUnitTests { @@ -4084,8 +4119,7 @@ class MappingMongoConverterUnitTests {
@Field(targetType = FieldType.DECIMAL128) //
BigDecimal bigDecimal;
@Field(targetType = FieldType.DECIMAL128)
BigInteger bigInteger;
@Field(targetType = FieldType.DECIMAL128) BigInteger bigInteger;
@Field(targetType = FieldType.INT64) //
Date dateAsLong;
@ -4100,6 +4134,10 @@ class MappingMongoConverterUnitTests { @@ -4100,6 +4134,10 @@ class MappingMongoConverterUnitTests {
Date dateAsObjectId;
}
static class WithBigNumericValues {
BigInteger bigInteger;
}
static class WrapperAroundWithUnwrapped {
String someValue;

Loading…
Cancel
Save