Spring 子文档中的SD MongoDB多态性

Spring 子文档中的SD MongoDB多态性,spring,mongodb,polymorphism,spring-data-mongodb,Spring,Mongodb,Polymorphism,Spring Data Mongodb,我刚开始用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

我刚开始用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 ...
}
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)
我有一个repository类,它有一个简单调用类似以下内容的查找的方法:

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的类型是foo(不是FooImpl),而foo又不能有属性,因为它是一个接口

我的问题是:有没有一种方法可以指定它或解决这个问题,而不将子文档类型声明为具体类型

我已经在谷歌上搜索了几天,查看了文档、API和源代码,但我找不到一个明确的方法。我非常感谢你的帮助


非常感谢。

我有一个类似的问题,我有一个实现接口的类,当我使用
findAll
时,我得到了错误:

org.springframework.data.mapping.model.mappinginstantificationException:无法实例化bean类[test.metalase]:指定的类是接口

调试完
SpringData
code后,我意识到Mapper使用
@TypeAlias
来发现它必须实例化的类型,所以我在
test.metaclass
的实现中加入了
@TypeAlias(“FullClassName”)
,它成功了


我测试了你的情况,它会起作用的

经过更多的测试,我注意到当我保存一个对象,然后从mongodb检索文档时,一切都很好。然而,当它是MongoDB的新的第一次读取时,我得到一个BeanInstantiationException。显然,objectCallback没有合适的类型映射器,无法将接口解析为具体类,以便为DBObject实例化。是否有其他解决方案?从设计的角度来看,这似乎真的很糟糕。您必须在
Foo
的每个实现中添加@TypeAlias注释。此外,这种方法使得重构非常困难。如果我需要重命名一个类怎么办?数据库中的所有_别名引用现在都是无用的。如果我需要抽象类,然后添加子实现,该怎么办?再次说明_别名引用现在是无用的。我将不得不编写一个脚本来遍历数据并全部更改它们。必须有更好的解决办法。