Spring-data-mongo无法使用Constructor实例化java.util.List

时间:2017-09-10 10:49:35

标签: java spring mongodb spring-data spring-data-mongodb

使用spring-data-mongodb-1.5.4mongodb-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:   无法使用构造函数NO_CONSTRUCTOR实例化java.util.List   带参数

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

我看到this question但不帮助我。

如何解决这个问题?

3 个答案:

答案 0 :(得分:5)

当您$unwind reviews字段时,查询的返回json结构不再与您的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);

答案 1 :(得分:0)

我遇到了这个问题,我在展开后使用“项目”管道解决了这个问题。 在春季启动聚合中会发生这种情况,但是在mongo shell中,展开后不需要项目

答案 2 :(得分:0)

一天前我突然想到一个非常不同的问题,让我发疯了很长时间,我认为在这里分享可能非常有用,即使它不是关于放松:

  • 一开始我用 java + mongoDB 设计了一个模型,其中我将一些字段放在文档内的一个键中并进行了几次测试,例如 {"header":{"key":"first", "value": 4}}
  • 然后我改变了主意,认为不要有简单的嵌套对象,而是要有一个更通用的列表,例如 {"header":[{"key":"first", "value": 4}] }

当我只处理新文档时,一切都运行良好,但是在进行更一般的测试时,我不断因有关 List 的 mongodb 错误而崩溃,因为在我的数据库中,我有没有列表的旧文档,但我忘记删除简单的对象并且与想要列表的新模型相冲突。

让我清理数据库并从头开始测试很简单。