Skip to content

Commit a977d26

Browse files
committed
Add a property for Data MongoDB's BigDecimal representation
Closes gh-47041
1 parent 1554c74 commit a977d26

File tree

4 files changed

+70
-7
lines changed

4 files changed

+70
-7
lines changed

module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoProperties.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.jspecify.annotations.Nullable;
2020

2121
import org.springframework.boot.context.properties.ConfigurationProperties;
22+
import org.springframework.data.mongodb.core.convert.MongoCustomConversions.BigDecimalRepresentation;
2223

2324
/**
2425
* Configuration properties for Spring Data MongoDB.
@@ -41,6 +42,8 @@ public class DataMongoProperties {
4142

4243
private final Gridfs gridfs = new Gridfs();
4344

45+
private final Representation representation = new Representation();
46+
4447
public @Nullable Boolean isAutoIndexCreation() {
4548
return this.autoIndexCreation;
4649
}
@@ -61,6 +64,10 @@ public Gridfs getGridfs() {
6164
return this.gridfs;
6265
}
6366

67+
public Representation getRepresentation() {
68+
return this.representation;
69+
}
70+
6471
public static class Gridfs {
6572

6673
/**
@@ -91,4 +98,21 @@ public void setBucket(@Nullable String bucket) {
9198

9299
}
93100

101+
public static class Representation {
102+
103+
/**
104+
* Representation to use when converting a BigDecimal.
105+
*/
106+
private BigDecimalRepresentation bigDecimal = BigDecimalRepresentation.DECIMAL128;
107+
108+
public BigDecimalRepresentation getBigDecimal() {
109+
return this.bigDecimal;
110+
}
111+
112+
public void setBigDecimal(BigDecimalRepresentation bigDecimal) {
113+
this.bigDecimal = bigDecimal;
114+
}
115+
116+
}
117+
94118
}

module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataConfiguration.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package org.springframework.boot.data.mongodb.autoconfigure;
1818

19-
import java.util.Collections;
20-
2119
import org.springframework.beans.BeanUtils;
2220
import org.springframework.beans.factory.ObjectProvider;
2321
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -48,6 +46,12 @@
4846
@Configuration(proxyBeanMethods = false)
4947
class MongoDataConfiguration {
5048

49+
private final DataMongoProperties properties;
50+
51+
MongoDataConfiguration(DataMongoProperties properties) {
52+
this.properties = properties;
53+
}
54+
5155
@Bean
5256
@ConditionalOnMissingBean
5357
static MongoManagedTypes mongoManagedTypes(ApplicationContext applicationContext) throws ClassNotFoundException {
@@ -56,13 +60,12 @@ static MongoManagedTypes mongoManagedTypes(ApplicationContext applicationContext
5660

5761
@Bean
5862
@ConditionalOnMissingBean
59-
MongoMappingContext mongoMappingContext(DataMongoProperties properties, MongoCustomConversions conversions,
60-
MongoManagedTypes managedTypes) {
63+
MongoMappingContext mongoMappingContext(MongoCustomConversions conversions, MongoManagedTypes managedTypes) {
6164
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
6265
MongoMappingContext context = new MongoMappingContext();
63-
map.from(properties.isAutoIndexCreation()).to(context::setAutoIndexCreation);
66+
map.from(this.properties.isAutoIndexCreation()).to(context::setAutoIndexCreation);
6467
context.setManagedTypes(managedTypes);
65-
Class<?> strategyClass = properties.getFieldNamingStrategy();
68+
Class<?> strategyClass = this.properties.getFieldNamingStrategy();
6669
if (strategyClass != null) {
6770
context.setFieldNamingStrategy((FieldNamingStrategy) BeanUtils.instantiateClass(strategyClass));
6871
}
@@ -73,7 +76,8 @@ MongoMappingContext mongoMappingContext(DataMongoProperties properties, MongoCus
7376
@Bean
7477
@ConditionalOnMissingBean
7578
MongoCustomConversions mongoCustomConversions() {
76-
return new MongoCustomConversions(Collections.emptyList());
79+
return MongoCustomConversions
80+
.create((configurer) -> configurer.bigDecimal(this.properties.getRepresentation().getBigDecimal()));
7781
}
7882

7983
@Bean

module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoPropertiesTests.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020

2121
import org.springframework.boot.autoconfigure.AutoConfigurations;
2222
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
23+
import org.springframework.data.mongodb.core.convert.MongoCustomConversions.BigDecimalRepresentation;
24+
import org.springframework.data.mongodb.core.convert.MongoCustomConversions.MongoConverterConfigurationAdapter;
25+
import org.springframework.test.util.ReflectionTestUtils;
2326

2427
import static org.assertj.core.api.Assertions.assertThat;
2528

@@ -40,4 +43,16 @@ void canBindAutoIndexCreation() {
4043
});
4144
}
4245

46+
@Test
47+
void defaultBigDecimalRepresentationIsAlignedWithSpringData() {
48+
BigDecimalRepresentation springDataDefault = springDataDefaultBigDecimalRepresentation();
49+
BigDecimalRepresentation springBootDefault = new DataMongoProperties().getRepresentation().getBigDecimal();
50+
assertThat(springBootDefault).isEqualTo(springDataDefault);
51+
}
52+
53+
private BigDecimalRepresentation springDataDefaultBigDecimalRepresentation() {
54+
return (BigDecimalRepresentation) ReflectionTestUtils.getField(new MongoConverterConfigurationAdapter(),
55+
"bigDecimals");
56+
}
57+
4358
}

module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfigurationTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,26 @@ void customConversions() {
118118
});
119119
}
120120

121+
@Test
122+
void customBigDecimalRepresentation() {
123+
this.contextRunner.withPropertyValues("spring.data.mongodb.representation.big-decimal=string")
124+
.run((context) -> assertThat(context.getBean(MongoCustomConversions.class)).extracting("converters")
125+
.asInstanceOf(InstanceOfAssertFactories.LIST)
126+
.map((converter) -> converter.getClass().getName())
127+
.anySatisfy((className) -> assertThat(className).contains("BigDecimalToStringConverter"))
128+
.anySatisfy((className) -> assertThat(className).contains("BigIntegerToStringConverter")));
129+
}
130+
131+
@Test
132+
void defaultBigDecimalRepresentation() {
133+
this.contextRunner
134+
.run((context) -> assertThat(context.getBean(MongoCustomConversions.class)).extracting("converters")
135+
.asInstanceOf(InstanceOfAssertFactories.LIST)
136+
.map((converter) -> converter.getClass().getName())
137+
.noneSatisfy((className) -> assertThat(className).contains("BigDecimalToStringConverter"))
138+
.noneSatisfy((className) -> assertThat(className).contains("BigIntegerToStringConverter")));
139+
}
140+
121141
@Test
122142
void usesAutoConfigurationPackageToPickUpDocumentTypes() {
123143
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();

0 commit comments

Comments
 (0)