【发布时间】:2014-10-03 23:15:36
【问题描述】:
以下问题已与此问题分开: ArrayIndexOutOfBoundsException while Spring save data to MongoDB
我在将对象保存到 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;
}
}
【问题讨论】:
-
能否提供ClassD的代码?
-
所有类都是带有setter和getter的简单bean。
标签: java spring mongodb spring-boot