Skip to content

Commit 2ee777f

Browse files
Add test to make sure custom converter has precedence over framework ones.
See: #5036
1 parent 41062ba commit 2ee777f

File tree

1 file changed

+35
-4
lines changed

1 file changed

+35
-4
lines changed

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

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@
5353
import org.mockito.Mock;
5454
import org.mockito.Mockito;
5555
import org.mockito.junit.jupiter.MockitoExtension;
56-
5756
import org.springframework.aop.framework.ProxyFactory;
5857
import org.springframework.beans.ConversionNotSupportedException;
5958
import org.springframework.beans.factory.annotation.Autowired;
@@ -109,6 +108,7 @@
109108
import org.springframework.data.projection.EntityProjectionIntrospector;
110109
import org.springframework.data.util.TypeInformation;
111110
import org.springframework.test.util.ReflectionTestUtils;
111+
import org.springframework.util.ObjectUtils;
112112

113113
import com.mongodb.BasicDBList;
114114
import com.mongodb.BasicDBObject;
@@ -3577,16 +3577,39 @@ void usesStringNumericFormat() {
35773577
assertThat(document).containsEntry("map.foo", "2.5");
35783578
}
35793579

3580+
@Test // GH-5036
3581+
void withCustomBigIntegerConversion() {
3582+
3583+
MappingMongoConverter converter = createConverter(MongoCustomConversions.BigDecimalRepresentation.STRING,
3584+
new CustomBigIntegerToStringConverter());
3585+
3586+
WithoutExplicitTargetTypes container = new WithoutExplicitTargetTypes();
3587+
container.bigInteger = BigInteger.TEN;
3588+
3589+
org.bson.Document document = new org.bson.Document();
3590+
converter.write(container, document);
3591+
3592+
assertThat(document).containsEntry("bigInteger", "BigInteger('10')");
3593+
}
3594+
35803595
private MappingMongoConverter createConverter() {
3581-
return createConverter(null);
3596+
return createConverter(null, new ByteBufferToDoubleHolderConverter());
35823597
}
35833598

35843599
private MappingMongoConverter createConverter(
3585-
MongoCustomConversions.BigDecimalRepresentation bigDecimalRepresentation) {
3600+
MongoCustomConversions.BigDecimalRepresentation bigDecimalRepresentation) {
3601+
return createConverter(bigDecimalRepresentation, new ByteBufferToDoubleHolderConverter());
3602+
}
3603+
3604+
private MappingMongoConverter createConverter(
3605+
MongoCustomConversions.BigDecimalRepresentation bigDecimalRepresentation, Converter<?,?>... customConverters) {
35863606

35873607
MongoCustomConversions conversions = MongoCustomConversions.create(
35883608
it -> {
3589-
it.registerConverter(new ByteBufferToDoubleHolderConverter());
3609+
3610+
if(!ObjectUtils.isEmpty(customConverters)) {
3611+
Arrays.stream(customConverters).forEach(it::registerConverter);
3612+
}
35903613

35913614
if (bigDecimalRepresentation != null) {
35923615
it.bigDecimal(bigDecimalRepresentation);
@@ -3614,6 +3637,14 @@ org.bson.Document write(Object source) {
36143637
return target;
36153638
}
36163639

3640+
@WritingConverter
3641+
static class CustomBigIntegerToStringConverter implements Converter<BigInteger, String> {
3642+
@Override
3643+
public String convert(BigInteger source) {
3644+
return "BigInteger('%s')".formatted(source.toString());
3645+
}
3646+
}
3647+
36173648
static class WithVector {
36183649

36193650
Vector embeddings;

0 commit comments

Comments
 (0)