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

时间:2013-03-11 20:31:07

标签: java

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

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

不幸的是我继续得到:

  

线程中的异常&#34; main&#34; java.lang.ClassCastException:com.mongodb.BasicDBObject无法强制转换为Test.main中的com.CustomChainData(Test.java:19)

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:0)

您需要设置对象类类型....在保存和检索对象之前使用setObjectClass DBCollection方法....在您的情况下,它应该是 -

DBCollection testdata = db.getCollection(&#34; testdata&#34;);  testdata.setObjectClass(CustomChainData.class);