2013-04-09 67 views
2

我正在使用Morphia與Play Framework 2.1項目和MongoDB數據庫,我在檢索一些數據時遇到問題。Morphia InstantiationException與抽象@Embedded類

我有一個類A和@Entity存儲在一個集合中。 但是那個類A有一個@Embedded List屬性,這個類B是抽象的並且有多個實現。

但是這個B類也有一個@Embedded類C屬性,這個C類也是抽象的,也可以有多個實現。

我不認爲這個結構是可用的「原樣」,而且Morphia可以處理它。 在我的數據庫中,對象存儲正確,沒有錯誤。

{ 
    "_id" : ObjectId("5163c9131a887c8e5aea8d5f"), 
    "className" : "package.to.ClassA", 
    "list" : [ 
     { 
      "propClassB" : [ 
       { 
        "className" : "package.to.an.ImplementationOfClassB", 
        "propClassC" : { 
         "className" : "package.to.an.ImplementationOfClassC" 
        } 
       } 
      ] 
     } 
    ] 
} 

A級標記@Entity,
B類標@Embedded(和@Polymorphic,但我不認爲它的使用)
C類標@Embedded(和@Polymorphic太)

我做錯了什麼? 謝謝大家!

回答

2

好夥計, 我想通了什麼是我的問題,我從來沒有想到會是這樣。 我在Morphia的Google group上找到了解決方案。

這是一個ClassLoader問題! 我能夠將我的實體保存到數據庫中,但第二個後,我無法檢索任何實體,無處不在拋出ClassNotFoundException ...

解決方案是「覆蓋」,Morphia的DefaultCreator提供播放應用程序類加載器,在全局類(它允許自定義應用程序的行爲,當它與(在onStart()和onBeforeStart()方法)開始。

Morphia morphia = applicationContext.getBean(Morphia.class); 

// Configuring class loader. 
morphia.getMapper().getOptions().objectFactory = new DefaultCreator() { 
    @Override 
    protected ClassLoader getClassLoaderForClass(String clazz, DBObject object) { 
     return app.classloader(); 
    } 
}; 

請注意,我使用Spring框架加載Morphia實例,但我看到有人在做新的Morphia(),我認爲它也可以(不是專家;))

瞧! 希望有一天能幫助別人!

+0

謝謝,我正面臨類似的問題。 – 2013-04-29 21:07:48