2013-04-09 68 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