以下问题已与此分开:
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.你采用的是什么版本?