Spring 未正确将对象保存到 MongoDB

ner*_*sol 6 java spring mongodb spring-boot

以下问题已与此问题分开: ArrayIndexOutOfBoundsException while Spring save data to MongoDB

我在将对象保存到 MongoDB 时遇到问题。我注意到问题可能是由过于复杂的对象引起的。我有以下类层次结构: 在此输入图像描述

ClassAClassB和的超类ClassCClassD包含地图的地图。ClassC包含ClassB.

我调用的代码如下:

ClassC c = new ClassC()
c.setName("NAME");
mongoOperation.save(c, "Mongo"); // MongoOperations object
Run Code Online (Sandbox Code Playgroud)

问题是 Mongo 不保存对象的数据。它仅保存_id_class

实际数据

{
    "_id" : ObjectId("53e86cd9c506f66eafaa03cb"),
    "_class" : "com.sample.ClassC"
}
Run Code Online (Sandbox Code Playgroud)

预期数据

{
    "_id" : ObjectId("53e86cd9c506f66eafaa03cb"),
    "_class" : "com.sample.ClassC",
    "name" : "NAME"
}
Run Code Online (Sandbox Code Playgroud)

有趣的是,当我注释掉地图字段时,ClassD一切正常。

是否可能是由我尝试序列化的对象过于复杂引起的?


编辑

当我bObject从中删除时ClassC也可以正常工作。


编辑2

所有类都是带有 setter 和 getter 的简单 bean。

例如

public class ClassD{

    private TreeMap<String, TreeMap<String,String>> map;

    public TreeMap<String, TreeMap<String, String>> getMap() {
        return map;
    }

    public void setMap(TreeMap<String, TreeMap<String, String>> map) {
        this.map = map;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑3

下面是完整的示例,它具有与上图相同的类层次结构。

public class Application implements CommandLineRunner {

    @Autowired
    private MongoTemplate mongoTemplate;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        ClassC cObject = new ClassC();
        cObject.setName("Jon");
        try {
            mongoTemplate.save(cObject);
        }catch(Exception e){
            e.printStackTrace();
        }
        mongoTemplate.save(cObject);
    }
}


class ClassA{

    private String name;

    private ClassD dObject;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public ClassD getdObject() {
        return dObject;
    }

    public void setdObject(ClassD dObject) {
        this.dObject = dObject;
    }
}

class ClassB extends ClassA {
}

class ClassC extends ClassA {
    private ClassB b;

    public ClassB getB() {
        return b;
    }

    public void setB(ClassB b) {
        this.b = b;
    }
}

class ClassD {

    private TreeMap<String, TreeMap<String, String>> map = new TreeMap<>();

    public TreeMap<String, TreeMap<String, String>> getMap() {
        return map;
    }
    public void setMap(TreeMap<String, TreeMap<String, String>> map) {
        this.map = map;
    }

}
Run Code Online (Sandbox Code Playgroud)

Wiz*_*ard 3

我猜MongoConverter您的 spring-data-mongodb.jar 的特定版本工作不正确。Spring必须将您的ClassC实例转换为DBObject格式,然后调用DBCollection.save将数据保存到数据库中。DBObject您可以检查方法中参数的内容"com.mongodb.DBCollection.save"是否包含您期望的正确数据。

我复制了你的ClassC完整结构和测试,它很好,无法重现你上面描述的内容。我使用 spring-data-mongdb-1.2.3-RELEASE.jar。您采用的是什么版本?