playframework-2.0 - Morphia InstantiationException 与抽象 @Embedded 类

标签 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)

我做错了什么吗? 谢谢大家!

最佳答案

好的,伙计们, 我明白了我的问题所在,但我从未想到会是这样。 我在 Google 群组中找到了 Morphia 的解决方案。

这是一个类加载器问题! 我能够将我的实体保存到数据库中,但第二次之后,我无法检索任何实体,到处抛出 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 实例,但我看到有人在执行 new Morphia(),我认为它也有效(不是专家;) )

瞧! 希望有一天它能帮助别人!

关于playframework-2.0 - Morphia InstantiationException 与抽象 @Embedded 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15907817/

相关文章:

Javadoc 创建 'Specified by' 标题

python - 如何为 Django 中的所有模型编写 __str__ 方法的通用实现?

Java错误=不是抽象的并且不重写抽象方法

java - 使用吗啡搜索对象数组

rest - Play Framework CRUD

session-cookies - 即使 session 关闭也存储 cookie

scala - 从 scala 访问公共(public)静态 java 方法

java - 吗非亚/MongoDB : can't do getmore

java - 为什么开始发生此异常 - java.lang.ClassCastException : java. lang.String 无法转换为 com.mongodb.DBObject

playframework-2.0 - Play Framework 表单的自定义输入文本标签