3

内部コレクションのマッピングに問題があります。アイテムは、さまざまなコンテンツ タイプを持つことができます。ここに私の Item クラスがあります:

@Document(collection = "items")
public class Item{
@Id
private ObjectId id;   
private List<? super Content> content;
...
}

Content は、この Item のさまざまなコンテンツの基本クラスです。

public class YoutubeVideo implements Content{
     private String url;
}

public class Image implements Content{
     private String location;
}
...

保存後 (問題なく終了して保存)、コンテンツ コレクションに 1 つの Image クラスと 2 つの YoutubeVideo クラスを持つアイテムで、この JSON を取得します

{ "_id" : { "$oid" : "4e423dcf7f3a0d12265da46c"} 
"content" : [ 
{ "location" : "hdd path"} , { "url" : "url path"} , { "url" : "url path"}
]}

私が期待していたのは、この JSON ではありません。このドキュメントを読み込んで逆シリアル化できない理由も理解できます。

java.lang.RuntimeException: Can not map ? super trngl.mongo.domain.content.Content

この種のオブジェクトをどのようにマッピングしますか? オブジェクトを手動でシリアライズおよびデシリアライズしたくありません。出来ますか?

関心のあるコンバーター クラスが見つかりました: mapping-explicit-converters

4

3 に答える 3

5

List<Content>とにかく、混合コンテンツリストから具体的なタイプにアクセスできないため、使用するのに十分なはずです。(ちなみに、ここではスーパーは間違いなく間違っていますContent。サブタイプのスーパータイプを保存していないためです。一方、拡張は追加の価値を追加しません)。

List<Content>MongoTemplate前回のマイルストーン リリース以降、かなりの数のバグを修正したため、最新のスナップショットで動作するはずです。リポジトリの抽象化を使用している場合Contentは、id プロパティを含む抽象クラスであることを確認してください。インターフェースをリポジトリ管理型としてもサポートするために注目したい未解決の問題があります。

于 2011-08-10T17:25:19.703 に答える
5

参考までに (メンバーとしてオブジェクトが返された理由を理解しようとした後LinkedHashMaps、おはようございます)、この問題は (1.0.2.RELEASE で) 保存しようとすると発生します。 aCollection<Content>の形式:

@Document(collection = "items")
public class Item{
@Id
private ObjectId id;   
private Collection<Content> content;
...
}

解決策は、上記のように、に切り替えることList<Content>です。

于 2012-09-20T15:20:09.577 に答える
0

コードは、クラス Contentを拡張List<? super Content> content;するタイプの要素を持つリストを作成します。ご覧のとおり、 Content - はインターフェイスであるため、ジェネリック バインディングを指定することはできません。

抽象クラス Content を作成し、クラスYoutubeVideoおよびImageでこのクラスを拡張することをお勧めします。その後、コードList<? super Content> content;は正常に動作します。

セルゲイ。

于 2011-08-10T09:40:01.597 に答える