为什么会发生此异常-java.lang.ClassCastException:java.lang.String无法强制转换为com.mongodb.DBObject

为什么会发生此异常-java.lang.ClassCastException:java.lang.String无法强制转换为com.mongodb.DBObject,java,mongodb,morphia,Java,Mongodb,Morphia,我正在开发我的第一个Java、MongoDB和Morphia应用程序,无法解决以下异常:- java.lang.RuntimeException: java.lang.ClassCastException: java.lang.String cannot be cast to com.mongodb.DBObject at org.mongodb.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:74)

我正在开发我的第一个Java、MongoDB和Morphia应用程序,无法解决以下异常:-

java.lang.RuntimeException: java.lang.ClassCastException: java.lang.String cannot be cast to com.mongodb.DBObject
    at org.mongodb.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:74)
    at org.mongodb.morphia.mapping.Mapper.readMappedField(Mapper.java:797)
    at org.mongodb.morphia.mapping.Mapper.fromDb(Mapper.java:250)
    at org.mongodb.morphia.mapping.Mapper.fromDBObject(Mapper.java:191)
    at org.mongodb.morphia.query.MorphiaIterator.convertItem(MorphiaIterator.java:134)
    at org.mongodb.morphia.query.MorphiaIterator.processItem(MorphiaIterator.java:146)
    at org.mongodb.morphia.query.MorphiaIterator.next(MorphiaIterator.java:117)
    at org.mongodb.morphia.query.QueryImpl.asList(QueryImpl.java:150)
    at test.DatabaseManagerTest.testListParent(DatabaseManagerTest.java:172)
我的技术堆栈如下所示:-

Java 8 jdk1.8.0_112
Morphia 1.2.1
Mongo java driver 3.2.2
我的父实体类:-

@Entity("parent")
public class Parent {

    @Id
    private ObjectId id;

    @Indexed(options = @IndexOptions(unique = false))
    private Child child;

    private String comment;

    private Date updateTimestamp;

}
我的孩子实体:-

@Embedded
public class Child {

    private int value;
    private String name;
}
失败的JUNIT代码:-

final Datastore datastore = DatabaseManager.getDatastore();

final Query<Parent> query = datastore.createQuery(Parent.class);
final List<Parent> parents = query.asList(); <<<< EXCEPTION OCCURS HERE

for (Parent parent : parents) {
    Assert.assertNotNull(parent);
}
final Datastore Datastore=DatabaseManager.getDatastore();
最终查询=datastore.createQuery(Parent.class);

final List parents=query.asList() 我认为问题在于存储在子字段中的数据。你有一些坏数据。如果我不得不猜测,因为我看不到数据,你有一个子字段,数据如下

“child”:“somestring”


这将解释为什么您会收到特定类型的类强制转换异常。

我遇到了同样的问题。我认为Mango不把字符串数据类型当作一个对象。如果mongo中存储的数据类型为string,而关联的Java变量类型为
Object
,则无法强制转换该变量,并引发此异常


在我的例子中,问题是我在
对象
变量中放置了一个
ArrayList
,morphia将其作为
字符串
插入Mongo(具有单个值的
ArrayList
似乎被解释为单个字符串)。导致异常,从而阻止加载Java对象。

我相信您是正确的。正如我通过创建一个新的数据库和重新填充新的测试数据“证明”的那样,一切都很好。有什么方法可以识别原始数据库中损坏的数据吗?不确定您将如何识别损坏的数据,但只要您通过应用程序保存和获取数据,您就可以了。