子文档中的 SD MongoDB 多态性

Rus*_*ell 3 polymorphism spring mongodb spring-data-mongodb

我刚刚开始使用 spring-data-mongodb 用 Ja​​va 开发一些应用程序,但遇到了一些我无法解决的问题:

有几个像这样的文档 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 ...
}
Run Code Online (Sandbox Code Playgroud)

而且我有一个存储库类,其中包含一个简单地调用类似于以下内容的 find 方法:

public List<? extends Bar> findByFooField(final String fieldValue) {
    Query query = Query.query(Criteria.where("foo.someField").is(fieldValue));
    return getMongoOperations().find(query, BarImpl.class);
}
Run Code Online (Sandbox Code Playgroud)

保存一个 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)
Run Code Online (Sandbox Code Playgroud)

经过一番挖掘,这是有道理的,因为在查询中没有指定子文档的具体类型,并且 Bar 的实体信息表示 foo 的类型是 Foo(不是 FooImpl),而后者又不能有属性因为它是一个接口。

我的问题是:有没有办法在不将子文档类型声明为具体类型的情况下指定它或解决此问题?

我已经用谷歌搜索了几天并查看了文档和 API 以及源代码,但我找不到明确的方法来做到这一点。我真的很感激你的帮助。

非常感谢。

小智 6

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

org.springframework.data.mapping.model.MappingInstantiationException:无法实例化 bean 类 [test.MetaClasse]:指定的类是一个接口。

在调试SpringData代码之后,我意识到 Mapper@TypeAlias用来发现它必须实例化的类型,所以我只是把@TypeAlias("FullClassName")我的实现放在了test.MetaClasse它的工作上!

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