使用抽象@Embedded类的Morphia InstantiationException

时间:2013-04-09 16:49:46

标签: playframework-2.0 abstract morphia

我正在使用Morphia和Play Framework 2.1项目以及MongoDB数据库,我在检索一些数据方面遇到了问题。

我有一个A类和@Entity存储在一个集合中。 但是A类具有@Embedded List属性,这个B类是抽象的,并且有多个实现。

但是这个B类还有一个@Embedded ClassC属性,这个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)

我做错了吗? 谢谢大家!

1 个答案:

答案 0 :(得分:2)

好的伙计们, 我弄清楚我的问题是什么,我从没想过会这样。 我在Morphia的Google网上找到了解决方案。

这是一个ClassLoader问题! 我能够将我的实体保存到数据库中,但是第二次,我无法检索任何实体,在任何地方抛出ClassNotFoundException ......

解决方案是“覆盖”Morphia的DefaultCreator,在Global类中提供Play应用程序类加载器(允许在开始时使用(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 Framework加载Morphia实例,但我看到有人在做新的Morphia(),我认为它也有效(不是专家;)

瞧!瞧! 希望有一天能帮到某人!