Spring-data-mongo не может создать экземпляр java.util.List с помощью конструктора

2

Использование spring-data-mongodb-1.5.4 и mongodb-driver-3.4.2

У меня классный Hotel

    public class Hotel {

        private String name;
        private int pricePerNight;
        private Address address;
        private List<Review> reviews;
//getter, setter, default constructor, parameterized constructor 

Класс Review:

public class Review {

    private int rating;
    private String description;
    private User user;
    private boolean isApproved;
 //getter, setter, default constructor, parameterized constructor 

Когда я звоню в Aggregation.unwind("reviews"); он бросает

org.springframework.data.mapping.model.MappingInstantiationException: не удалось создать экземпляр java.util.List с использованием конструктора NO_CONSTRUCTOR с аргументами

UnwindOperation unwindOperation = Aggregation.unwind("reviews");
Aggregation aggregation = Aggregation.newAggregation(unwindOperation);
AggregationResults<Hotel> results=mongoOperations.aggregate(aggregation,"hotel", Hotel.class);

Я вижу этот вопрос, но не помогает.

Как это решить?

  • 1
    9/10 раз вам действительно нужен простой объект BSON, такой как Document.class или DBObject.class для агрегированного вывода. Агрегации изменяют форму вывода, определяя, что они должны делать. Как правило, вам просто не нужен строгий тип для вывода, если вам действительно не нужна некоторая настраиваемая сериализация. Для всего остального, просто используйте дженерики. Вот для чего они здесь.
Теги:
spring
spring-data
spring-data-mongodb

1 ответ

4
Лучший ответ

Когда вы $unwind reviews, запрос return json structure больше не соответствует вашему классу Hotel. Поскольку операция $unwind делает reviews под-объектом вместо списка. Если вы попробуете свой запрос в robomongo или некоторых других инструментах, вы можете увидеть, что ваш возвращаемый объект подобен этому

{
  "_id" : ObjectId("59b519d72f9e340bcc830cb3"),
  "id" : "59b23c39c70ff63135f76b14",
  "name" : "Signature",
  "reviews" : {
    "id" : 1,
    "userName" : "Salman",
    "rating" : 8,
    "approved" : true
  }
}

Таким образом, вы должны использовать другой класс вместо Hotel например, UnwindedHotel

public class UnwindedHotel {

    private String name;
    private int pricePerNight;
    private Address address;
    private Review reviews;
}

UnwindOperation unwindOperation = Aggregation.unwind("reviews");
Aggregation aggregation = Aggregation.newAggregation(unwindOperation);
AggregationResults<UnwindedHotel> results=mongoOperations.aggregate(aggregation,"hotel", UnwindedHotel.class);
  • 0
    Вы спасли меня снова :)
  • 2
    @MehrajMalik Рад помочь. И общее предложение, которое я делаю для своих запросов. Сначала соберите их как собственный запрос mongodb и попробуйте напрямую через robomongo и т. Д. Затем закодируйте его в spring-data. Таким образом, вы можете быть уверены, что ваш запрос работает и возвращает значения, как и ожидалось.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню