Короткие резюме до простых примеров:
- Вставка новых документов в порядке, в том смысле, что он использует свой собственный конвертер
- Обновление существующего документа не в порядке, в том смысле, что оно не использовать мой обычай преобразователь
Мои Deps:
[INFO] +- org.springframework.data:spring-data-mongodb:jar:1.0.0.RC1:compile
[INFO] | +- org.springframework:spring-beans:jar:3.1.0.RELEASE:compile
[INFO] | +- org.springframework:spring-expression:jar:3.1.0.RELEASE:compile
[INFO] | +- org.springframework.data:spring-data-commons-core:jar:1.2.0.RC1:compile
[INFO] | | \- org.springframework:spring-tx:jar:3.1.0.RELEASE:compile
[INFO] | \- org.mongodb:mongo-java-driver:jar:2.7.1:compile
Вот мой класс, который имеет собственный преобразователь в это
public class MyClass extends MyInterface<String> ..
Вот преобразователи:
public class MyClassWriteConverter implements Converter<MyClass, DBObject> {
@Override
public DBObject convert(MyClass myClass) {
System.out.println("MyClass WRITE CONVERTER !");
DBObject dbo = new BasicDBObject();
dbo.put("title", myClass.getTitle());
dbo.put("value", myClass.getValue());
System.out.println("value : " + myClass.getValue());
System.out.println("class : " + myClass.getClass().getCanonicalName());
dbo.put("_class", myClass.getClass().getCanonicalName());
return dbo;
}
}
public class MyClassElementReadConverter implements Converter<DBObject, MyClass> {
@Override
public MyClass convert(DBObject dbObject) {
String value = (String) dbObject.get("value");
String title = (String) dbObject.get("title");
return new MyClass(title, value);
}
}
<mongo:converter>
<bean class="kam.albert.MyClassElementReadConverter" />
</mongo:converter>
<mongo:converter>
<bean class="kam.albert.MyClassElementWriteConverter" />
</mongo:converter>
MYDOMAIN имеет List<MyClass<?>> myClasses
, и это работает отлично, как используется пользовательский преобразователь:
this.ops.save(myDomain, "myCollection");
Что можно увидеть от отладочного выхода:
MyClass ELEMENT WRITE CONVERTER !
value : my value
class : kam.albert.MyClass
И имеет результат из моего db.myCollection.find(). Pretty(); :
{
myClasses : [
{
"title" : "my title",
"value" : "my value",
"_class" : "kam.albert.MyClass"
}
]
}
Все еще хорошо с операцией вставки ...
Но когда я сделать $ установить обновление существующего документа, как это:
this.ops.updateFirst(
this.idCriteria(myClass),
new Update()
// set the content node
.set(dotNotation, myClass),
"myCollection"
);
Выход отладки остается прежним :
MyClass ELEMENT WRITE CONVERTER !
value : my value
class : kam.albert.MyClass
(edited for clarity, the other properties omitted)
DEBUG [mongodb.core.MongoTemplate]: calling update using query: { "_id" : "81d3292e-fd75-410d-a1f9-b109b6d76194"} and update: { "$
set" : { "myClasses" : [ { "title" : "my title" , "value" : "my value"}]}] } in collection: myCollection
Но результат подобен без использования пользовательского конвертера без «_class» attri Бьют:
{
myClasses : [
{
"title" : "my title",
"value" : "my value",
}
]
}
Мои текущие выводы:
- Для вставки нового документа, пользовательский преобразователь работает отлично
- Для обновления, хотя, хотя обычай конвертер, кажется, называется (отладочный есть), но, по-видимому, он использует по умолчанию MappingMongoConverter для выполнения реального обновления.
Я что-то не хватает? Пожалуйста, поделитесь своими мыслями ..