我剛開始開發一些Java應用程序與彈簧數據的MongoDB和遇到一些問題,我一直沒能解決傳來:SD MongoDB的多態性子文檔
有幾個文件豆這樣的:
@Document(collection="myBeanBar")
public class BarImpl implements Bar {
String id;
Foo foo;
// More fields and methods ...
}
@Docuemnt
public class FooImpl implements Foo {
String id;
String someField;
// some more fields and methods ...
}
而且我有一個簡單地調用找到一個類似的方法庫類:
public List<? extends Bar> findByFooField(final String fieldValue) {
Query query = Query.query(Criteria.where("foo.someField").is(fieldValue));
return getMongoOperations().find(query, BarImpl.class);
}
保存酒吧工作得很好,它會保存在蒙戈沿Foo和Bar的「_class」屬性。然而,在富一些屬性找到會拋出這樣的例外:
Exception in thread "main" java.lang.IllegalArgumentException: No property someField found on test.Foo!
at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentPropertyPath(AbstractMappingContext.java:225)
at org.springframework.data.mongodb.core.convert.QueryMapper.getPath(QueryMapper.java:202)
at org.springframework.data.mongodb.core.convert.QueryMapper.getTargetProperty(QueryMapper.java:190)
at org.springframework.data.mongodb.core.convert.QueryMapper.getMappedObject(QueryMapper.java:86)
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1336)
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1322)
at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:495)
at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:486)
其中,一些挖後,有一定道理,因爲無處查詢是被指定的子文檔的具體類型和實體Bar的信息表明foo的類型是Foo(而不是FooImpl),而Foo的類型又不具有屬性,因此它是一個接口。
我的問題是:有沒有一種方法來指定它或解決這個問題,而無需將子文檔類型聲明爲具體類型?
我一直使用Google搜索幾天,看文檔和API和源代碼,但我找不到一個明確的方法來做到這一點。我非常感謝你的幫助。
非常感謝。
經過一些更多的測試後,我注意到當我保存一個對象然後從mongodb中檢索文檔時,一切都很好。 但是,當它是第一次從MongoDB讀取時,我得到一個BeanInstantiationException。顯然,objectCallback沒有合適的TypeMapper,它可以將接口解析爲具體的類來爲DBObject實例化。 – Russell 2013-03-18 23:52:39