我在Mongo中有一个数组,我想把它放到一个列表中。
这就是我所拥有的
BasicDBList computerList = new BasicDBList();
if (dbObj.get("computers") != null){
computerList = (BasicDBList) dbObj.get("computers");
}
for (Object obj : computerList) {
System.getComputers().add((Computer) obj);
}
我有一个主System
对象,里面有一个List,我在这里正在尝试从Mongo中检索computers
并重新投入到dataObject中。
我收到错误
Caused by: java.lang.ClassCastException: com.mongodb.BasicDBObject cannot be cast to com.me.systems.commons.entities.Computer
关于我能做什么的任何想法?
编辑: 我确实对对象的名称进行了模糊处理,但我仔细检查了它们,并且它们与语法一致且准确。
答案 0 :(得分:1)
我假设您的变量dbObj
是从MongoDB检索到的DBObject,我还假设在示例代码的第6行抛出了ClassCastException。
问题是您在代码示例中的第6行进行了转换,并且您正在转换为错误的类型。当你从MongoDB获得一些东西时,你不会得到你的Java对象(即计算机)。数据库中的任何文档或子文档都将作为BasicDBObject返回。这不能投射到计算机上。
您需要做的是从BasicDBObject中获取相关信息,然后从中创建一台新计算机。所以,例如你的计算机看起来像这样:
class Computer {
String name;
int ipAddress;
Computer(final String name, final int ipAddress) {
this.name = name;
this.ipAddress = ipAddress;
}
}
然后你可能会想做类似的事情:
final BasicDBObject dbObj = null;
if (dbObj.get("computers") != null){
computerList = (BasicDBList) dbObj.get("computers");
}
for ( obj : computerList) {
final BasicDBObject computerAsDBObject = (BasicDBObject) obj;
final Computer computer = new Computer(computerAsDBObject.getString("name"),
computerAsDBObject.getInt("ipAddress"));
System.getComputers().add(computer);
}
当您直接使用Java驱动程序时,您将只从数据库中获取一组非常有限的类型 - 即字符串,整数,长整数和其他基元,以及简单对象,如BasicDBList和BasicDBObject。
Abhishek在评论中提到的是,如果你使用像Morphia或Spring Data这样的ODM,你将从Mongo获得像你的计算机类这样的“真正的”Java对象,但你不会得到驱动程序单独