5353import org .springframework .core .convert .converter .ConditionalConverter ;
5454import org .springframework .core .convert .converter .Converter ;
5555import org .springframework .core .convert .converter .ConverterFactory ;
56+ import org .springframework .core .env .Environment ;
57+ import org .springframework .core .env .StandardEnvironment ;
5658import org .springframework .data .convert .ReadingConverter ;
5759import org .springframework .data .convert .WritingConverter ;
5860import org .springframework .data .domain .Vector ;
@@ -89,14 +91,27 @@ private MongoConverters() {}
8991 */
9092 static Collection <Object > getConvertersToRegister () {
9193
94+ Environment env = new StandardEnvironment ();
95+ boolean flagPresent = env .containsProperty ("mongo.decimal128.representation" );
96+ boolean decimalToString = !flagPresent || env .getProperty ("mongo.decimal128.representation" , String .class , "string" ).equals ("string" );
97+
9298 List <Object > converters = new ArrayList <>();
9399
94- converters .add (BigDecimalToStringConverter .INSTANCE );
100+ if (decimalToString ) {
101+ converters .add (BigDecimalToStringConverter .INSTANCE );
102+ converters .add (StringToBigDecimalConverter .INSTANCE );
103+ } else {
104+ //converters.add(new NumberToNumberConverter<>())
105+ }
106+
95107 converters .add (BigDecimalToDecimal128Converter .INSTANCE );
96- converters .add (StringToBigDecimalConverter .INSTANCE );
97108 converters .add (Decimal128ToBigDecimalConverter .INSTANCE );
98- converters .add (BigIntegerToStringConverter .INSTANCE );
99- converters .add (StringToBigIntegerConverter .INSTANCE );
109+
110+ if (decimalToString ) {
111+ converters .add (BigIntegerToStringConverter .INSTANCE );
112+ converters .add (StringToBigIntegerConverter .INSTANCE );
113+ }
114+
100115 converters .add (URLToStringConverter .INSTANCE );
101116 converters .add (StringToURLConverter .INSTANCE );
102117 converters .add (DocumentToStringConverter .INSTANCE );
@@ -111,6 +126,7 @@ static Collection<Object> getConvertersToRegister() {
111126 converters .add (IntegerToAtomicIntegerConverter .INSTANCE );
112127 converters .add (BinaryToByteArrayConverter .INSTANCE );
113128 converters .add (BsonTimestampToInstantConverter .INSTANCE );
129+ converters .add (NumberToNumberConverterFactory .INSTANCE );
114130
115131 converters .add (VectorToBsonArrayConverter .INSTANCE );
116132 converters .add (ListToVectorConverter .INSTANCE );
@@ -174,12 +190,20 @@ public ObjectId convert(BigInteger source) {
174190 }
175191 }
176192
177- enum BigDecimalToStringConverter implements Converter <BigDecimal , String > {
193+ enum BigDecimalToStringConverter implements Converter <BigDecimal , String >, ConditionalConverter {
178194 INSTANCE ;
179195
196+ Environment env = new StandardEnvironment ();
197+
180198 public String convert (BigDecimal source ) {
181199 return source .toString ();
182200 }
201+
202+ @ Override
203+ public boolean matches (TypeDescriptor sourceType , TypeDescriptor targetType ) {
204+ boolean flagPresent = env .containsProperty ("mongo.decimal128.representation" );
205+ return !flagPresent || env .getProperty ("mongo.decimal128.representation" , String .class , "string" ).equals ("string" );
206+ }
183207 }
184208
185209 /**
@@ -212,12 +236,21 @@ public BigDecimal convert(Decimal128 source) {
212236 }
213237 }
214238
215- enum BigIntegerToStringConverter implements Converter <BigInteger , String > {
239+ enum BigIntegerToStringConverter implements Converter <BigInteger , String >, ConditionalConverter {
216240 INSTANCE ;
217241
242+ Environment env = new StandardEnvironment ();
243+
218244 public String convert (BigInteger source ) {
219245 return source .toString ();
220246 }
247+
248+ @ Override
249+ public boolean matches (TypeDescriptor sourceType , TypeDescriptor targetType ) {
250+
251+ boolean flagPresent = env .containsProperty ("mongo.decimal128.representation" );
252+ return !flagPresent || env .getProperty ("mongo.decimal128.representation" , String .class , "string" ).equals ("string" );
253+ }
221254 }
222255
223256 enum StringToBigIntegerConverter implements Converter <String , BigInteger > {
@@ -414,6 +447,17 @@ public NumberToNumberConverter(Class<T> targetType) {
414447 @ Override
415448 public T convert (Number source ) {
416449
450+ if (targetType == Decimal128 .class ) {
451+
452+ if (source instanceof BigDecimal bigDecimal ) {
453+ return targetType .cast (BigDecimalToDecimal128Converter .INSTANCE .convert (bigDecimal ));
454+ }
455+
456+ if (source instanceof BigInteger bigInteger ) {
457+ return targetType .cast (new Decimal128 (bigInteger .longValueExact ()));
458+ }
459+ }
460+
417461 if (source instanceof AtomicInteger atomicInteger ) {
418462 return NumberUtils .convertNumberToTargetClass (atomicInteger .get (), this .targetType );
419463 }
0 commit comments