微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – Spring没有正确地将对象保存到MongoDB

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

我将Object保存到MongoDB时遇到问题.我注意到这个问题可能是由太复杂的对象引起的.我有以下类层次结构:

ClassA是ClassB和ClassC的超类. ClassD包含地图的地图. ClassC包含ClassB.

调用代码如下:

ClassC c = new ClassC()
c.setName("NAME");
mongoOperation.save(c, "Mongo"); // MongoOperations object

问题是Mongo不保存对象的数据.它只保存_id和_class.

实际数据

{
    "_id" : ObjectId("53e86cd9c506f66eafaa03cb"),
    "_class" : "com.sample.ClassC"
}

预期数据

{
    "_id" : ObjectId("53e86cd9c506f66eafaa03cb"),
    "_class" : "com.sample.ClassC",
    "name" : "NAME"
}

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

是否有可能是由于我试图序列化的太复杂的对象造成的?

编辑

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

编辑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;
    }
}

编辑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;
    }

}

解决方法:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐