![](/img/trans.png)
[英]java.lang.ClassCastException when using custom classloader
[英]java.lang.ClassCastException when mapping to Custom Object
我有一个收藏集,如下所示:
db.testdata.save(
{
"Indicator": "One",
"secs": [
{
"when": "2013-03-16",
"num": 16,
"choices": [
{
"size": "10",
"mult": "10"
},
{
"size": "10",
"mult": "10"
}
]
},
{
"when": "2013-03-22",
"num": 24,
"choices": [
{
"size": "100",
"mult": "100"
},
{
"size": "100",
"mult": "100"
}
]
}
]
})
我正在尝试使用“自定义对象”检索它,如下所示:
public class Test {
public static void main(String args[]) throws UnknownHostException {
Mongo mongo = new Mongo();
DB db = mongo.getDB("at");
DBCollection testdata = db.getCollection("testdata");
BasicDBObject query = new BasicDBObject();
query.put("Indicator", "One");
CustomChainData ocd = (CustomChainData) testdata.findOne(query);
ocd.getWhen().size();
}
}
import java.util.List;
import com.mongodb.BasicDBObject;
public class CustomChainData extends BasicDBObject{
public CustomChainData() {
super();
}
@SuppressWarnings("unchecked")
public List<WhenData> getWhen() {
return (List<WhenData>) get("secs");
}
public void setWhen(List<WhenData> expirationDts) {
put("secs", expirationDts);
}
}
import com.mongodb.BasicDBObject;
public class WhenData extends BasicDBObject{
public String getSize() {
return (String) get("size");
}
public void setSize(String size) {
put("size", size);
}
}
不幸的是,我不断得到:
线程“主”中的异常java.lang.ClassCastException:com.mongodb.BasicDBObject无法在Test.main(Test.java:19)上强制转换为com.CustomChainData。
MongoDB Java驱动程序不自动支持使用BasicDBObject
子类。 这就是为什么您得到ClassCastException
; 驱动程序返回的对象是BasicDBObject
实例,而不是您的子类的实例。
一种可行的选择是用构造函数调用替换强制类型转换。 例如,在Test
,替换
CustomChainData ocd = (CustomChainData) testdata.findOne(query);
与
CustomChainData ocd = new CustomChainData(testdata.findOne(query));
并在CustomChainData
,添加
CustomChainData(Map m) {
super(m);
}
这使用一个复制构造函数来允许您的CustomChainData
类与从MongoDB加载的数据一起使用。 但是,每次返回BasicDBObject
时,都需要应用此模式(例如,对于When对象)。
我更喜欢使用在MongoDB数据和Java对象之间执行映射的库的方法。 我过去使用过Morphia ,对此感到非常满意。 其他选项在MongoDB Java语言中心中列出。
您需要设置对象类类型。...在保存和检索对象之前,请使用DBCollection的 setObjectClass方法。
DBCollection testdata = db.getCollection(“ testdata”); testdata.setObjectClass(CustomChainData.class);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.