Как отобразить общие коллекции с помощью Spring Data (MongoDB)? - PullRequest
3 голосов
/ 10 августа 2011

У меня есть некоторые проблемы с отображением моей внутренней коллекции. Элементы могут иметь разные типы контента. Вот мой класс предметов:

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

Контент - это базовый класс для другого контента для этого элемента.

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

Как бы вы отобразили этот тип объекта? Я не хочу сериализовать и десериализовывать объекты вручную. Возможно ли это?

Найдены классы конвертеров интереса: преобразователи явного преобразования

Ответы [ 3 ]

4 голосов
/ 10 августа 2011

Должно быть достаточно использовать List<Content>, так как вы все равно не можете получить доступ к конкретным типам из смешанного списка содержимого. (Кстати, super здесь определенно не прав, поскольку вы не храните супертипы Content, но подтипы. Расширения с другой стороны не добавят никакого дополнительного значения).

List<Content> должен работать с последними снимками для MongoTemplate, так как мы исправили довольно много ошибок с момента последнего выпуска. Если вы используете нашу абстракцию репозитория, убедитесь, что Content является абстрактным классом, содержащим свойство id. Существует открытая проблема , которую вы, возможно, захотите, чтобы мы поддерживали интерфейсы в качестве управляемых типов репозитория.

4 голосов
/ 20 сентября 2012

Так же, как к вашему сведению (поскольку мы охотились за этим добрым утром после попытки выяснить, почему мы возвращали наши объекты как LinkedHashMaps членов), эта проблема также возникает (в версии 1.0.2.RELEASE) , при попытке сохранить Collection<Content> в виде:

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

Решение, как указано выше, состоит в том, чтобы переключить его на List<Content>.

0 голосов
/ 10 августа 2011

Код List<? super Content> content; создает список с элементами, с типом, который расширяет класс Content. Как я вижу, Content - это интерфейс, поэтому для него нельзя указать универсальную привязку.

Я бы предложил вам создать абстрактный класс Content и расширить этот класс вашими классами YoutubeVideo и Image . После этого код List<? super Content> content; будет работать нормально.

Сергей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...