|
36 | 36 | import org.springframework.core.convert.converter.Converter;
|
37 | 37 | import org.springframework.core.convert.converter.ConverterFactory;
|
38 | 38 | import org.springframework.core.convert.converter.GenericConverter;
|
| 39 | +import org.springframework.core.env.Environment; |
| 40 | +import org.springframework.core.env.StandardEnvironment; |
39 | 41 | import org.springframework.data.convert.ConverterBuilder;
|
40 | 42 | import org.springframework.data.convert.PropertyValueConversions;
|
41 | 43 | import org.springframework.data.convert.PropertyValueConverter;
|
|
45 | 47 | import org.springframework.data.convert.SimplePropertyValueConversions;
|
46 | 48 | import org.springframework.data.convert.WritingConverter;
|
47 | 49 | import org.springframework.data.mapping.model.SimpleTypeHolder;
|
| 50 | +import org.springframework.data.mongodb.core.convert.MongoConverters.BigDecimalToStringConverter; |
| 51 | +import org.springframework.data.mongodb.core.convert.MongoConverters.BigIntegerToStringConverter; |
| 52 | +import org.springframework.data.mongodb.core.convert.MongoConverters.StringToBigDecimalConverter; |
| 53 | +import org.springframework.data.mongodb.core.convert.MongoConverters.StringToBigIntegerConverter; |
| 54 | +import org.springframework.data.mongodb.core.mapping.MongoMappingContext; |
48 | 55 | import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
|
49 | 56 | import org.springframework.data.mongodb.core.mapping.MongoSimpleTypes;
|
50 | 57 | import org.springframework.lang.Nullable;
|
@@ -154,11 +161,18 @@ public static class MongoConverterConfigurationAdapter {
|
154 | 161 | private static final Set<Class<?>> JAVA_DRIVER_TIME_SIMPLE_TYPES = Set.of(LocalDate.class, LocalTime.class, LocalDateTime.class);
|
155 | 162 |
|
156 | 163 | private boolean useNativeDriverJavaTimeCodecs = false;
|
| 164 | + private String numericFormat; |
157 | 165 | private final List<Object> customConverters = new ArrayList<>();
|
158 | 166 |
|
159 | 167 | private final PropertyValueConversions internalValueConversion = PropertyValueConversions.simple(it -> {});
|
160 | 168 | private PropertyValueConversions propertyValueConversions = internalValueConversion;
|
161 | 169 |
|
| 170 | + { |
| 171 | + Environment env = new StandardEnvironment(); |
| 172 | + boolean flagPresent = env.containsProperty("mongo.numeric.format"); |
| 173 | + numericFormat = flagPresent ? env.getProperty("mongo.numeric.format", String.class, "string") : "string"; |
| 174 | + } |
| 175 | + |
162 | 176 | /**
|
163 | 177 | * Create a {@link MongoConverterConfigurationAdapter} using the provided {@code converters} and our own codecs for
|
164 | 178 | * JSR-310 types.
|
@@ -298,6 +312,11 @@ public MongoConverterConfigurationAdapter useSpringDataJavaTimeCodecs() {
|
298 | 312 | return useNativeDriverJavaTimeCodecs(false);
|
299 | 313 | }
|
300 | 314 |
|
| 315 | + // TODO: might just be a flag like the time codec? |
| 316 | + public MongoConverterConfigurationAdapter numericFormat(String format) { |
| 317 | + this.numericFormat = format; |
| 318 | + return this; |
| 319 | + } |
301 | 320 | /**
|
302 | 321 | * Optionally set the {@link PropertyValueConversions} to be applied during mapping.
|
303 | 322 | * <p>
|
@@ -347,15 +366,24 @@ ConverterConfiguration createConverterConfiguration() {
|
347 | 366 | svc.init();
|
348 | 367 | }
|
349 | 368 |
|
| 369 | + List<Object> converters = new ArrayList<>(STORE_CONVERTERS.size() + 7); |
| 370 | + if(numericFormat.equals("string")) { |
| 371 | + converters.add(BigDecimalToStringConverter.INSTANCE); |
| 372 | + converters.add(StringToBigDecimalConverter.INSTANCE); |
| 373 | + converters.add(BigIntegerToStringConverter.INSTANCE); |
| 374 | + converters.add(StringToBigIntegerConverter.INSTANCE); |
| 375 | + } |
| 376 | + |
350 | 377 | if (!useNativeDriverJavaTimeCodecs) {
|
351 |
| - return new ConverterConfiguration(STORE_CONVERSIONS, this.customConverters, convertiblePair -> true, |
| 378 | + |
| 379 | + converters.addAll(customConverters); |
| 380 | + return new ConverterConfiguration(STORE_CONVERSIONS, converters, convertiblePair -> true, |
352 | 381 | this.propertyValueConversions);
|
353 | 382 | }
|
354 | 383 |
|
355 | 384 | /*
|
356 | 385 | * We need to have those converters using UTC as the default ones would go on with the systemDefault.
|
357 | 386 | */
|
358 |
| - List<Object> converters = new ArrayList<>(STORE_CONVERTERS.size() + 3); |
359 | 387 | converters.add(DateToUtcLocalDateConverter.INSTANCE);
|
360 | 388 | converters.add(DateToUtcLocalTimeConverter.INSTANCE);
|
361 | 389 | converters.add(DateToUtcLocalDateTimeConverter.INSTANCE);
|
|
0 commit comments