2013-05-27 37 views
1

使用自定義轉換器時發現問題。mongoTemplate:使用非標準對象的自定義轉換器

比方說,我的對象是:

public class Foo { 
    private String id; 
    private Bar bar; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public Bar getBar() { 
     return bar; 
    } 

    public void setBar(Bar bar) { 
     this.bar = bar; 
    } 
} 

public class Bar { 
    private String id; 
    private String property; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getProperty() { 
     return property; 
    } 

    public void setProperty(String property) { 
     this.property = property; 
    } 
} 

如果它們插入到MongoDB的,一切工作正常,只要不自定義轉換涉及。

Bar bar = new Bar(); 
    bar.setProperty("Test"); 
    Foo foo = new Foo(); 
    foo.setBar(bar); 

    mongoTemplate.insert(bar); 
    mongoTemplate.insert(foo); 

結果:

{ 
    "_id" : { 
     "$oid" : "51a346059f2c9d656019798e" 
    }, 
    "_class" : "Bar", 
    "property" : "Test" 
} 
{ 
    "_id" : { 
     "$oid" : "51a346059f2c9d656019798f" 
    }, 
    "_class" : "Foo", 
    "bar" : { 
     "_id" : { 
      "$oid" : "51a346059f2c9d656019798e" 
     }, 
     "property" : "Test" 
    } 
} 

現在,我寫了一個自定義轉換器,原因美孚需要被存儲在一個特殊的方式。

public class FooWriteConverter implements Converter<Foo, DBObject> { 

    @Override 
    public DBObject convert(Foo source) { 
     DBObject dbo = new BasicDBObject(); 
     dbo.put("id", source.getId()); 
     dbo.put("bar", source.getBar()); 
     return dbo; 
    } 

} 

現在我得到這個錯誤。

Caused by: java.lang.IllegalArgumentException: can't serialize class Bar 

因此,它看起來像我不能退回到對象的屬性的默認轉換,即使用自定義轉換器轉換?

任何有用的解決方案,而不是手動進行所有轉換?

回答

1

爲了在自定義轉換器中使用默認轉換屬性,您需要一個MongoConverter類幫助。

public class FooWriteConverter implements Converter<Foo, DBObject> { 
    private MongoConverter mongoConverter; 

    public FooWriteConverter(MongoConverter mongoConverter) { 
     this.mongoConverter = mongoConverter; 
    } 

    @Override 
    public DBObject convert(Foo source) { 
     DBObject dbo = new BasicDBObject(); 
     dbo.put("id", source.getId()); 

     DBObject bar = new BasicDBObject(); 
     mongoConverter.write(source.getBar(), bar); 
     dbo.put("bar", bar); 
     return dbo; 
    } 
} 
+0

這工作正常。我如何執行回來的路? mongoConverter.read(Bar.class ...不起作用,它表示讀取的方法(類 ...不適用於參數類 Nabor

+0

我撤回了這個問題,不知道什麼是錯誤的,但它的工作原理讀。 – Nabor