gpt4 book ai didi

mongodb - spring-data-mongodb 中没有 "_class"属性的对象的默认实现映射

转载 作者:行者123 更新时间:2023-12-04 15:12:51 25 4
gpt4 key购买 nike

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

class Wrapper {
private Child child;
}

class Child { ... }

当 mongodb 序列化这个类时,它从不为 child 对象设置 _class 属性。现在我需要制作下一个类结构:

class Wrapper {
private Child child;
}

abstract class Child { ... }

class ChildA extends Child { ... }

class ChildB extends Child { ... }

很明显,然后我尝试反序列化旧文档,它会抛出异常,因为它无法实例化抽象类。

问题是:是否有任何方法可以指定对象反序列化的默认实现?例如,如果 _class 属性不存在,如 this,我想将 child 字段反序列化到 Child1 类中Jackson 库中的参数?

最佳答案

这可能不是最佳解决方案,因为我怀疑有办法控制 mongo 反序列化。然而,如果你想避免挖掘那口井,你可以使用 Mongo lifecycle events 中的一个。 .特别是,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");
}
}
}

或者,(虽然我知道这不是你问的问题),根据你有多少数据,你可以编写一个 mongodb 脚本,简单地更新所有现有记录以具有 _class 字段:

db.wrappers.update(
{
"child" : { $exists : true},
"child._class" : { $exists : false }
},
{
$set:{
"child._class" : "ChildA"
}
},
{
multi: true,
upsert: false
}
)

关于mongodb - spring-data-mongodb 中没有 "_class"属性的对象的默认实现映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64878319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com