【发布时间】:2013-01-30 23:21:43
【问题描述】:
我刚开始使用 spring-data-mongodb 用 Java 开发一些应用程序,遇到了一些我无法解决的问题:
有几个像这样的文档 bean:
@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);
}
保存 Bar 效果很好,它将与 Foo 和 Bar 的“_class”属性一起保存在 mongo 中。但是,通过 Foo 中的某些属性查找会引发如下异常:
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),这反过来可以没有属性,因为它是一个接口。
我的问题是:有没有办法在不将子文档类型声明为具体类型的情况下指定它或解决此问题?
我已经在谷歌上搜索了几天,查看了文档和 API 以及源代码,但我找不到明确的方法。非常感谢您的帮助。
非常感谢。
【问题讨论】:
-
经过更多测试,我注意到当我保存一个对象然后从 mongodb 检索文档时,一切正常。但是,当它是第一次从 MongoDB 读取时,我得到一个 BeanInstantiationException。显然 objectCallback 没有适当的 TypeMapper 可以将接口解析为具体类以实例化 DBObject。
标签: spring mongodb polymorphism spring-data-mongodb