为什么开始出现此异常 - java.lang.ClassCastException:java.lang.String 无法转换为 com.mongodb.DBObject

Why has this exception started occurring - java.lang.ClassCastException: java.lang.String cannot be cast to com.mongodb.DBObject

我正在开发我的第一个 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

我的父实体 class:-

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

我在注释我的两个实体 classes 时犯了什么错误?

我猜它与嵌入式 Child class 有关,因为堆栈跟踪提到 org.mongodb.morphia.mapping.EmbeddedMapper

我觉得奇怪的是,无论如何我都没有更改父 and/or 子 class,而且我所有的测试过去都很好。

今天我重新 运行 我的测试,他们已经开始抛出这个异常。

我认为问题出在子字段中存储的数据。你有一些坏数据。如果我不得不猜测,因为我无法查看数据,那么您有一个包含

等数据的子字段

"child" : "somestring"

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

我遇到了同样的问题。我认为 mongo 不将字符串数据类型视为对象。如果 mongo 中存储的数据是字符串类型,而关联的 Java 变量的类型为 Object,则无法转换该变量并抛出此异常。

在我的例子中,问题是我在 Object 变量中放置了一个 ArrayList<String>,而吗啡将其作为 String(一个 ArrayList 具有单个值似乎被解释为单个字符串)。这会导致阻止加载 Java 对象的异常。