Я использую SpringBoot с MongoDB, у меня есть документ, как показано на рисунке ниже.
документ в mongodb (изображение)
И я сопоставлен скласс java:
@Document(collection = "instrument")
public abstract class Instrument extends BaseMongoEntity<String> {
@NotEmpty
private String feedProviderId;
@NotEmpty
private String code;
@NotEmpty
private String name;
private Map<String, Object> instrumentData;
private Map<String, Object> commonInfo;
private List<InstrumentHistoricalData> historicalData;
private List<DelayedInstrumentData> delayedData;
private String market;
// Getters, setters, builders, etc.
}
Конечно, поле instrumentData содержит много данных, но ради аргумента, который я только что написал, эти два в документе показаны.Поэтому моя проблема в том, что я не могу преобразовать NOW_PRICE в BigDecimal.Я могу написать это без проблем, от BigDecimal до Decimal128, но не наоборот.
Я настроил и читатель, и писатель, как показано ниже:
@Configuration
public class MongoConfig {
@Bean
public MongoCustomConversions mongoCustomConversions() {
return new MongoCustomConversions(Arrays.asList(
new BigDecimalDecimal128Converter(),
new Decimal128BigDecimalConverter()
));
}
@WritingConverter
private static class BigDecimalDecimal128Converter implements
Converter<BigDecimal, Decimal128> {
@Override
public Decimal128 convert(@NonNull BigDecimal source) {
return new Decimal128(source);
}
}
@ReadingConverter
private static class Decimal128BigDecimalConverter implements
Converter<Decimal128, BigDecimal> {
@Override
public BigDecimal convert(@NonNull Decimal128 source) {
return source.bigDecimalValue();
}
}
}
Итак, проверяя MappingMongoConverter.class, я заметил это:
protected Map<Object, Object> readMap(TypeInformation<?> type, Bson bson, ObjectPath path) {
Assert.notNull(bson, "Document must not be null!");
Assert.notNull(path, "Object path must not be null!");
Class<?> mapType = typeMapper.readType(bson, type).getType();
TypeInformation<?> keyType = type.getComponentType();
TypeInformation<?> valueType = type.getMapValueType();
Class<?> rawKeyType = keyType != null ? keyType.getType() : null;
Class<?> rawValueType = valueType != null ? valueType.getType() : null;
Map<String, Object> sourceMap = asMap(bson);
Map<Object, Object> map = CollectionFactory.createMap(mapType, rawKeyType, sourceMap.keySet().size());
if (!DBRef.class.equals(rawValueType) && isCollectionOfDbRefWhereBulkFetchIsPossible(sourceMap.values())) {
bulkReadAndConvertDBRefMapIntoTarget(valueType, rawValueType, sourceMap, map);
return map;
}
for (Entry<String, Object> entry : sourceMap.entrySet()) {
if (typeMapper.isTypeKey(entry.getKey())) {
continue;
}
Object key = potentiallyUnescapeMapKey(entry.getKey());
if (rawKeyType != null && !rawKeyType.isAssignableFrom(key.getClass())) {
key = conversionService.convert(key, rawKeyType);
}
Object value = entry.getValue();
TypeInformation<?> defaultedValueType = valueType != null ? valueType : ClassTypeInformation.OBJECT;
if (value instanceof Document) {
map.put(key, read(defaultedValueType, (Document) value, path));
} else if (value instanceof BasicDBObject) {
map.put(key, read(defaultedValueType, (BasicDBObject) value, path));
} else if (value instanceof DBRef) {
map.put(key, DBRef.class.equals(rawValueType) ? value
: readAndConvertDBRef((DBRef) value, defaultedValueType, ObjectPath.ROOT, rawValueType));
} else if (value instanceof List) {
map.put(key, readCollectionOrArray(valueType != null ? valueType : ClassTypeInformation.LIST,
(List<Object>) value, path));
} else {
map.put(key, getPotentiallyConvertedSimpleRead(value, rawValueType));
}
}
return map;
}
Таким образом, он только спрашивает, является ли значение экземпляром Document, BasicDBObject, DBRef или List.В противном случае предполагается, что значение уже сопоставлено, а это не так, потому что это числовое значение и эта возможность не рассматривается.
Я что-то упустил?Есть ли решение этой проблемы?Спасибо!