我刚刚开始使用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的Entity Information说foo的类型是Foo(不是FooImpl),这又不能具有属性因为它是一个接口.
我的问题是:有没有办法在不将子文档类型声明为具体类型的情况下指定它或解决此问题?
我已经搜寻了几天,并查看了文档和API以及源代码,但是我找不到一种清晰的方法.非常感谢您的帮助.
非常感谢你.
解决方法:
我有一个类似的问题,我有一个实现接口的类,当我使用findAll时出现错误:
org.springframework.data.mapping.model.MappingInstantiationException: Could not instantiate bean class [test.MetaClasse]: Specified class is an interface.
在调试SpringData代码之后,我意识到Mapper使用@TypeAlias来发现它必须实例化的类型,因此我将@TypeAlias(“ FullClassName”)放在了test.MetaClasse的实现上,并且可以正常工作!
我测试了您的情况,它将起作用!