2012-01-09 2 views
2

Короткие резюме до простых примеров:

  • Вставка новых документов в порядке, в том смысле, что он использует свой собственный конвертер
  • Обновление существующего документа не в порядке, в том смысле, что оно не использовать мой обычай преобразователь

Мои 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 для выполнения реального обновления.

Я что-то не хватает? Пожалуйста, поделитесь своими мыслями ..

ответ

2

Кажется, что текущая версия (1.0 GA на момент написания) не передает объект Update в QueryMapper, который отвечает за массирование содержащихся потенциально сложных объектов в те, что MongoDB может обрабатывать обрабатывать изначально. В этом процессе необходимо вызвать MongoConverter, который должен в свою очередь запускать ваши пользовательские преобразователи.

Проблема снята в the ticket you just filed и будет исправлена ​​с помощью следующей версии исправления ошибок (1.0.1, 1.1.M1).

Смежные вопросы