маппинг моноконвертер readMap - PullRequest
0 голосов
/ 26 января 2019

Я использую 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.В противном случае предполагается, что значение уже сопоставлено, а это не так, потому что это числовое значение и эта возможность не рассматривается.

Я что-то упустил?Есть ли решение этой проблемы?Спасибо!

1 Ответ

0 голосов
/ 28 января 2019

Если вы углубитесь в getPotentiallyConvertedSimpleRead(…), вы увидите, что мы проверяем CustomConversionInstance на наличие зарегистрированной конверсии.Я могу только предположить, что в вашей конфигурации что-то не так, но я не вижу ничего страшного.У вас есть пример проекта, с которым я могу поиграть?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...