尝试实例化抽象类时MongoDB中出现异常
我们在Mongo DB 1.3.3中使用Spring数据,在检索其中一个嵌套对象为抽象类型的文档时出现异常。如果我们将用户类更改为具体的,则不会引发异常,代码也可以正常工作 BSON结构:尝试实例化抽象类时MongoDB中出现异常,mongodb,spring-data,bson,Mongodb,Spring Data,Bson,我们在Mongo DB 1.3.3中使用Spring数据,在检索其中一个嵌套对象为抽象类型的文档时出现异常。如果我们将用户类更改为具体的,则不会引发异常,代码也可以正常工作 BSON结构: { "_id" : { "$oid" : "52d99dec88c6bd5da9c05a86"}, "_class": "com.xyz.Quote" , "name" : "sssds" , "quoteNumber" : 1006 , "account" : {
{ "_id" : { "$oid" : "52d99dec88c6bd5da9c05a86"},
"_class": "com.xyz.Quote" ,
"name" : "sssds" ,
"quoteNumber" : 1006 ,
"account" : { "accountNumber" : "060926" ,
"phone" : [ ] , "fax" : [ ] ,
"leadDealerAccount" : "066418" ,
................................................
"quoteCreatedBy" : { "_class" : "com.xyz.DealerUser" ,
"lastName" : "TILLMAN" ,
"firstName" : "TIMOTHY" ,
"middleName" : "M"
}
}
Query searchQuoteQuery = new Query(Criteria.where("account.leadDealerAccount"). is(066418));
List<Quote> mongoTemplate.find(searchQuoteQuery , Quote.class);
POJO课程:
public abstract class User {
private String lastName;
private String firstName;
}
public class DealerUser extends User {
private Account primaryAccount;
}
public class AnotherUser extends User{
private List<Address> availableAddresses;
}
public class Quote {
private User quoteCreatedBy;
}
从stacktrace(以及Java基本逻辑)可以明显看出,您无法在Java中实例化抽象类。那么,您希望Spring数据API如何将JSON数据填充到无法实例化的类中呢??Spring将从mongodb获取数据,并尝试将相同的数据推送到指定类的POJO中(在您的情况下,POJO是抽象的,无法实例化)。从stacktrace(以及Java基本逻辑)可以明显看出,您无法在Java中实例化抽象类。那么,您希望Spring数据API如何将JSON数据填充到无法实例化的类中呢??Spring将从mongodb获取数据,并尝试将相同的数据推送到指定类的POJO中(在您的情况下,POJO是抽象的,不能实例化)。用@BsonDiscriminator注释您的类:
@org.bson.codecs.pojo.annotations.BsonDiscriminator()
public class DealerUser {}
public class Some class {
@org.bson.codecs.pojo.annotations.BsonProperty(useDiscriminator = true)
private User user;
}
此外,如果用户
类是其他类的属性/字段,则必须使用@BsonProperty(useDiscriminator=true)注释该字段:
@org.bson.codecs.pojo.annotations.BsonDiscriminator()
public class DealerUser {}
public class Some class {
@org.bson.codecs.pojo.annotations.BsonProperty(useDiscriminator = true)
private User user;
}
用@BsonDiscriminator注释您的类:
@org.bson.codecs.pojo.annotations.BsonDiscriminator()
public class DealerUser {}
public class Some class {
@org.bson.codecs.pojo.annotations.BsonProperty(useDiscriminator = true)
private User user;
}
此外,如果用户
类是其他类的属性/字段,则必须使用@BsonProperty(useDiscriminator=true)注释该字段:
@org.bson.codecs.pojo.annotations.BsonDiscriminator()
public class DealerUser {}
public class Some class {
@org.bson.codecs.pojo.annotations.BsonProperty(useDiscriminator = true)
private User user;
}
有没有办法达到预期的行为?有没有办法达到预期的行为?