如何在SpringData MongoDb Java bean中映射二进制数据?

时间:2015-08-18 18:59:12

标签: java spring mongodb

我有一个bean,它包含一个Java对象,该对象在Mongo DB中存储为二进制数据。 引入SpringData进行映射给了我这个问题。 所以,Bean代码是:

@Document(collection = “cache”)
public class CacheBean {
    ... 
    private Object objectData;
    ...
}

Mongo Db的插入代码是:

protected void setToMongo(String key, Object value){
    ByteArrayOutputStream b = new ByteArrayOutputStream();
    ObjectOutputStream o = new ObjectOutputStream(b);
    o.writeObject(value);
    CacheBean cacheBean = new CacheBean();
    cacheBean.setObjectData(getBytesForObject(o));
    mongoTemplate.save(cacheBean);
}
private byte[] getBytesForObject(Object o) throws IOException{
    ByteArrayOutputStream b = new ByteArrayOutputStream();
    ObjectOutputStream os = new ObjectOutputStream(b);
    os.writeObject(o);
    return b.toByteArray();
}

提取代码如下:

Object resultObject = cacheBean.getObjectData();
org.bson.types.Binary result = (Binary) resultObject;
ByteArrayInputStream b = new ByteArrayInputStream(result.getData());
ObjectInputStream o = new ObjectInputStream(b);
return o.readObject();

我在线上获得了例外

org.bson.types.Binary result = (Binary) resultObject:

java.lang.ClassCastException:[B无法强制转换为org.bson.types.Binary

1 个答案:

答案 0 :(得分:2)

MongoDB隐式存储(我认为)字节数组为Bson BinData。

请注意,您自己将objectData设置为字节数组:

cacheBean.setObjectData(getBytesForObject(o));

此时private Object objectData;的类型为byte[]

所以没有什么能阻止你在CacheBean中声明这一点:

private byte[] objectData;

因此......

ByteArrayInputStream b = new ByteArrayInputStream(cacheBean.getObjectData());
ObjectInputStream o = new ObjectInputStream(b);
return o.readObject();

为方便起见,您可能还希望将对象类存储为字段。