2012-01-09 54 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()。漂亮(); :

{ 
    myClasses : [ 
     { 
      "title" : "my title", 
      "value" : "my value", 
      "_class" : "kam.albert.MyClass" 
     } 
    ] 
} 

所有仍與插入操作OK ......

但是,當我提出$設置更新到這樣一個現有的文檔:

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中捕獲,並將在下一個bug修復版本(1.0.1,1.1.M1)中修復。