4

以下に示すようなコレクションがあります。

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

残念ながら、私は取得し続けました:

スレッド「main」の例外java.lang.ClassCastException:com.mongodb.BasicDBObjectをTest.main(Test.java:19)のcom.CustomChainDataにキャストできません

4

2 に答える 2

6

MongoDB Java ドライバーは、 のサブクラスを自動的に使用することをサポートしていませんBasicDBObject。それがあなたが得ている理由ですClassCastException; ドライバーによって返されるオブジェクトはBasicDBObjectインスタンスであり、サブクラスのインスタンスではありません。

これを機能させるための 1 つのオプションは、キャストをコンストラクター呼び出しに置き換えることです。たとえば、 では次のよう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 オブジェクトの間のマッピングを実行するライブラリを使用するアプローチを好みます。過去にモルフィアを使用したことがありますが、非常に満足しています。その他のオプションは、MongoDB Java Language Centerにリストされています。

于 2013-03-12T01:28:23.783 に答える