3

我在映射我的内部收藏时遇到了一些问题。项目可以有不同的内容类型。这是我的项目类:

@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;
}
...

在内容集合中保存(保存完成没有问题)带有一个图像和两个 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>因为无论如何您都无法从混合内容列表中访问具体类型。(顺便说一句,super 在这里绝对是错误的,因为您不存储子类型的超Content类型。另一方面,扩展不会增加任何附加值)。

List<Content>应该使用最新的快照,MongoTemplate因为我们修复了自上一个里程碑版本以来的相当多的错误。如果您使用我们的存储库抽象,请确保Content是一个包含 id 属性的抽象类。您可能希望看到一个未解决的问题,让我们也支持将接口作为存储库管理类型。

于 2011-08-10T17:25:19.703 回答
5

就像一个仅供参考(因为我们在试图弄清楚为什么我们要让我们的对象返回成员之后寻找这个早上好LinkedHashMaps),这个问题也会发生(在 1.0.2.RELEASE 中),当你尝试存储一个Collection<Content>形式:

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

如上所述,解决方案是将其切换为List<Content>.

于 2012-09-20T15:20:09.577 回答
0

代码List<? super Content> content;创建包含元素和类型的列表,它扩展了类 Content。如我所见, Content - 是一个接口,因此您不能为其指定通用绑定。

我建议你创建抽象类 Content 并通过你的类YoutubeVideoImage扩展这个类。之后,代码List<? super Content> content;将正常工作。

谢尔盖。

于 2011-08-10T09:40:01.597 回答