3

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とソースコードを見てきましたが、それを行う明確な方法が見つかりません. よろしくお願いします。

どうもありがとうございました。

4

1 に答える 1

6

同様の問題がありました。インターフェイスを実装するクラスがあり、使用するfindAllとエラーが発生します。

org.springframework.data.mapping.model.MappingInstantiationException: Bean クラスをインスタンス化できませんでした [test.MetaClasse]: 指定されたクラスはインターフェースです。

コードをデバッグした後、インスタンス化する必要がある型を検出するために Mapper を使用していることSpringDataに気付きました。@TypeAlias@TypeAlias("FullClassName")test.MetaClasse

私はあなたの状況でテストしましたが、うまくいきます!

于 2013-02-20T13:35:30.730 に答える