3

我刚开始使用 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 ...
}

我有一个存储库类,它的方法简单地调用类似于这样的查找:

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 以及源代码,但我找不到明确的方法。我真的很感谢你的帮助。

非常感谢你。

4

1 回答 1

6

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

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

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

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

于 2013-02-20T13:35:30.730 回答