繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM