gpt4 book ai didi

映射到自定义对象时出现 java.lang.ClassCastException

转载 作者:搜寻专家 更新时间:2023-11-01 02:12:36 26 4
gpt4 key购买 nike

我有一个如下所示的集合:

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);
}
}

不幸的是我不断得到:

Exception in thread "main" java.lang.ClassCastException: com.mongodb.BasicDBObject cannot be cast to com.CustomChainData at Test.main(Test.java:19)

最佳答案

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 Language Center 中列出了其他选项.

关于映射到自定义对象时出现 java.lang.ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15348022/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com