为什么开始出现此异常 - 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 对象的异常。
我正在开发我的第一个 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 对象的异常。