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...