不带“的对象的默认实现映射”_“类”;spring数据mongodb中的属性

不带“的对象的默认实现映射”_“类”;spring数据mongodb中的属性,mongodb,spring-data,spring-data-mongodb,Mongodb,Spring Data,Spring Data Mongodb,我还有一个问题:在项目开始时,我只有一个类的实现: class Wrapper { private Child child; } class Child { ... } 当mongodb序列化这个类时,它从不为子对象设置\u class属性。 现在我需要创建下一个类结构: class Wrapper { private Child child; } abstract class Child { ... } class ChildA extends Child { ...

我还有一个问题:在项目开始时,我只有一个类的实现:

class Wrapper {
    private Child child;
}

class Child { ... }
当mongodb序列化这个类时,它从不为
子对象设置
\u class
属性。 现在我需要创建下一个类结构:

class Wrapper {
    private Child child;
}

abstract class Child { ... }

class ChildA extends Child { ... }

class ChildB extends Child { ... }
显然,当我尝试反序列化旧文档时,它会抛出一个异常,因为它无法实例化抽象类


问题是:是否可以指定对象反序列化的默认实现?例如,如果
\u class
属性不像Jackson library中的参数那样存在,我想将
child
字段反序列化到
Child1
类中?

这可能不是最佳解决方案,因为我怀疑有控制mongo反序列化的方法。然而,如果你想避免挖到那口井里,你可以使用其中一个。特别是,onAfterLoad在从数据库读取文档之后,但在将其转换为java对象之前被调度

因此,使用事件,您可以检查传入的json,甚至在转换之前对其进行更改。。。以下是一个针对您的情况的示例:

@Component
public class WrapperRepositoryListener extends AbstractMongoEventListener<Wrapper> {

    @Override
    public void onAfterLoad(AfterLoadEvent<Wrapper> event) {
        Document doc = event.getDocument();
        Document child = (Document)doc.get("child");        
        if (!child.containsKey("_class")) {   
            child.put("_class", "ChildA");
        }
    }
}
db.wrappers.update(
    { 
        "child" : { $exists : true},
        "child._class" : { $exists : false }
    }, 
    {
        $set:{
            "child._class" : "ChildA"
        }
    },    
    { 
        multi: true, 
        upsert: false    
    }
)