From 4dc1b644fec962eba77b7607a36947e309e67a28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Tue, 9 Sep 2025 16:13:04 +0200 Subject: [PATCH] Adapt to change in MongoDB's BigDecimal and UUID default representations See https://github.com/spring-projects/spring-data-mongodb/issues/5037 See gh-47041 --- .../autoconfigure/DataMongoProperties.java | 6 +++--- .../autoconfigure/MongoDataConfiguration.java | 9 +++++++-- .../MongoDataAutoConfigurationTests.java | 18 +++++++++++++++--- .../mongodb/autoconfigure/MongoProperties.java | 2 +- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoProperties.java b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoProperties.java index 7f8f3491264..40e31ead5c1 100644 --- a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoProperties.java +++ b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoProperties.java @@ -103,13 +103,13 @@ public class DataMongoProperties { /** * Representation to use when converting a BigDecimal. */ - private BigDecimalRepresentation bigDecimal = BigDecimalRepresentation.DECIMAL128; + private @Nullable BigDecimalRepresentation bigDecimal; - public BigDecimalRepresentation getBigDecimal() { + public @Nullable BigDecimalRepresentation getBigDecimal() { return this.bigDecimal; } - public void setBigDecimal(BigDecimalRepresentation bigDecimal) { + public void setBigDecimal(@Nullable BigDecimalRepresentation bigDecimal) { this.bigDecimal = bigDecimal; } diff --git a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataConfiguration.java b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataConfiguration.java index 7171c6fb4a2..ed199cd8dd2 100644 --- a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataConfiguration.java +++ b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataConfiguration.java @@ -32,6 +32,7 @@ import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver; import org.springframework.data.mongodb.core.convert.MappingMongoConverter; import org.springframework.data.mongodb.core.convert.MongoConverter; import org.springframework.data.mongodb.core.convert.MongoCustomConversions; +import org.springframework.data.mongodb.core.convert.MongoCustomConversions.BigDecimalRepresentation; import org.springframework.data.mongodb.core.convert.NoOpDbRefResolver; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; @@ -76,8 +77,12 @@ class MongoDataConfiguration { @Bean @ConditionalOnMissingBean MongoCustomConversions mongoCustomConversions() { - return MongoCustomConversions - .create((configurer) -> configurer.bigDecimal(this.properties.getRepresentation().getBigDecimal())); + return MongoCustomConversions.create((configurer) -> { + BigDecimalRepresentation bigDecimaRepresentation = this.properties.getRepresentation().getBigDecimal(); + if (bigDecimaRepresentation != null) { + configurer.bigDecimal(bigDecimaRepresentation); + } + }); } @Bean diff --git a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfigurationTests.java b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfigurationTests.java index ed0a389bc1d..016209abff7 100644 --- a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfigurationTests.java +++ b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfigurationTests.java @@ -119,7 +119,8 @@ class MongoDataAutoConfigurationTests { } @Test - void customBigDecimalRepresentation() { + @Deprecated(since = "4.0.0") + void customBigDecimalDeprecatedRepresentation() { this.contextRunner.withPropertyValues("spring.data.mongodb.representation.big-decimal=string") .run((context) -> assertThat(context.getBean(MongoCustomConversions.class)).extracting("converters") .asInstanceOf(InstanceOfAssertFactories.LIST) @@ -128,14 +129,25 @@ class MongoDataAutoConfigurationTests { .anySatisfy((className) -> assertThat(className).contains("BigIntegerToStringConverter"))); } + @Test + void customBigDecimalRepresentation() { + this.contextRunner.withPropertyValues("spring.data.mongodb.representation.big-decimal=decimal128") + .run((context) -> assertThat(context.getBean(MongoCustomConversions.class)).extracting("converters") + .asInstanceOf(InstanceOfAssertFactories.LIST) + .map((converter) -> converter.getClass().getName()) + .anySatisfy((className) -> assertThat(className).contains("BigDecimalToDecimal128Converter")) + .anySatisfy((className) -> assertThat(className).contains("BigIntegerToDecimal128Converter"))); + } + @Test void defaultBigDecimalRepresentation() { this.contextRunner .run((context) -> assertThat(context.getBean(MongoCustomConversions.class)).extracting("converters") .asInstanceOf(InstanceOfAssertFactories.LIST) .map((converter) -> converter.getClass().getName()) - .noneSatisfy((className) -> assertThat(className).contains("BigDecimalToStringConverter")) - .noneSatisfy((className) -> assertThat(className).contains("BigIntegerToStringConverter"))); + .filteredOn((className) -> className.startsWith("org.springframework.data.mongodb")) + .noneSatisfy((className) -> assertThat(className).contains("BigDecimalTo")) + .noneSatisfy((className) -> assertThat(className).contains("BigIntegerTo"))); } @Test diff --git a/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/MongoProperties.java b/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/MongoProperties.java index f8491ae1ddc..78447bb640d 100644 --- a/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/MongoProperties.java +++ b/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/MongoProperties.java @@ -212,7 +212,7 @@ public class MongoProperties { /** * Representation to use when converting a UUID to a BSON binary value. */ - private UuidRepresentation uuid = UuidRepresentation.STANDARD; + private UuidRepresentation uuid = UuidRepresentation.UNSPECIFIED; public UuidRepresentation getUuid() { return this.uuid;