Spring data mongodb: конвертировать POJO-конвертер по умолчанию из пользовательского конвертера

У меня есть spring настройка пользовательских преобразователей данных mongo через xml следующим образом

<mongo:mapping-converter id="mongoConverter" db-factory-ref="mongoDbFactory">
    <mongo:custom-converters>
        <mongo:converter ref="customWriteConverter" />
        <mongo:converter ref="customReadConverter" />
    </mongo:custom-converters>
</mongo:mapping-converter>

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg ref="mongoDbFactory"/>
    <constructor-arg ref="mongoConverter"/>
</bean>

<bean id="customWriteConverter" class="package.WriteConverter" />
<bean id="customReadConverter" class="package.ReadConverter" />

В пользовательском конвертере чтения/записи я хотел бы повторно использовать spring -data-mongo default pojo converter для сохранения определенных свойств в качестве поддокументов.

рассмотрим упрощенный пример -

class A {
    B b;
    String var1;
    int var2;
}

class B {
    String var3;
    String var4;
}

Я хочу обработать преобразование класса A с помощью customWriteConverter и customReadConverter, но в моих пользовательских конвертерах я также хочу делегировать преобразование класса B обратно в конвертер POJO spring -data-mongo.

Как я могу это сделать? Я не смог успешно автоустановить MongoConverter или MongoTemplate в пользовательский конвертер, так как создается MongoConverter/MongoTemplate bean, когда он пытается создать собственный конвертер. Можно ли получить доступ к конвертеру по умолчанию и использовать его из пользовательского конвертера?

Ответ 1

Этот метод используется в классе MongoTemplate для получения конвертера по умолчанию.

private static final MongoConverter getDefaultMongoConverter(MongoDbFactory factory) {
    DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);
    MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, new MongoMappingContext());
    converter.afterPropertiesSet();
    return converter;
}

MappingMongoConverter не является окончательным и поэтому может быть переопределен для определенной цели. Как уже упоминалось в моем комментарии выше, посмотрите этот вопрос, чтобы найти решение проблемы.

Ответ 2

Если вы конвертируете в базу данных mongo и хотите по умолчанию конвертировать некоторые файлы, вы можете сделать что-то вроде этого:

    ...

    @Resource
    private ObjectFactory<MappingMongoConverter>
        mappingMongoConverterObjectFactory;

    private MappingMongoConverter
        mappingMongoConverter;

    ...

    //Otherwise, use default MappingMongoConverter
    //
    if (result == null)
        result =
            getMappingMongoConverter()
                .convertToMongoType(
                    value
                );

    ...

    MappingMongoConverter getMappingMongoConverter() {
        if (mappingMongoConverter == null)
            mappingMongoConverter =
                mappingMongoConverterObjectFactory.getObject();
        return
            mappingMongoConverter;
    }

MappingMongoConverter не может быть непосредственно @Resource (ed) в моем случае, поскольку он находится в процессе создания при создании других преобразователей. Таким образом, Spring обнаруживает циклическую ссылку. Я не уверен, есть ли лучший "ленивый" способ сделать это без всякого обхода ObjectFactory, метода getter и кеширования.

Теперь, если кто-то может определить метод отказа от стандартной обработки при возврате (от объекта DBObject до java Object), который завершит этот круг.

Ответ 3

Попробуйте ввести BeanFactory в ваш конвертер и в методе конвертирования выберите mongoTemplate из BeanFactory...