2016-12-08 778 views
0

我正在开发我的第一个Java,MongoDB,Morphia应用程序,并且无法解决以下异常: -为什么会发生此异常 - java.lang.ClassCastException:java.lang.String不能转换为com.mongodb.DBObject

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

,我是用我的注释两个实体类做了哪些错误?

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

我觉得奇怪的是,我还没有chnaged父类和/或孩子类,我的所有测试都用于传递正常。

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

回答

2

我认为问题是存储在子字段中的数据。你有一些不好的数据。如果我猜,我可以不看数据,你已经与数据子场像

“孩子”:“somestring”

这将解释为什么您会收到类抛出异常的特定类型。

+0

我相信你是对的。正如我通过创建一个新的数据库并重新填充新的测试数据来“证明”这一点,它一切正常。有什么方法可以识别原始数据库中的损坏数据吗? – Hector

+0

不知道你会如何识别损坏的数据,但只要你通过应用程序保存和提取,你应该没问题。 – Veeram

0

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

在我的情况下,这个问题是我在Object变量置于ArrayList<String>和吗啡其插入到蒙戈为String(的ArrayList有一个价值似乎被解释为一个字符串)。原因是一个阻止加载Java对象的异常。

相关问题