从Mongo映射BIGDECIMAL,缺少CONSTRUCTOR

时间:2014-11-24 12:55:26

标签: json spring mongodb spring-data-mongodb

当我想从具有BigDecimal字段的mongo获取对象时,我遇到了问题。

我在mongo中有下一个结构:

{
"_id":ObjectId("546b07420c74bf96c7c3cd5f"),
"accountId":"1",
"modelVersion":"seasonal_optimized",
"yearMonth":"20143",
   "income":{
        "unscaled":{
           "$numberLong":"68500"
         },
       "scale":2
      },
     "expense":{
         "unscaled":{
         "$numberLong":"125900"
      },
     "scale":2
     }
}

实体是:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "forecasts")
public class Forecast {

    private String accountId;
    private LocalDate monthYear;
    private String modelVersion;
    private BigDecimal income;
    private BigDecimal expense;


}

我正在尝试从mongo中检索一个对象,但是我收到了下一个错误:

org.springframework.data.mapping.model.MappingInstantiationException:无法使用带参数的构造函数NO_CONSTRUCTOR实例化java.math.BigDecimal。

任何人都可以帮助我吗?

谢谢!!!!

1 个答案:

答案 0 :(得分:0)

这是一个老问题,但我使用Spring数据mongo和聚合框架时遇到了同样的问题。 特别是当我想要一个BigDecimal作为返回类型时。

一种可行的解决方法是将BigDecimal包装在一个类中,并将其作为返回OutPutType提供,即:

@Data
public class AverageTemperature {
    private BigDecimal averageTemperature;
}

@Override
public AverageTemperature averageTemperatureByDeviceIdAndDateRange(String deviceId, Date from, Date to) {
    final Aggregation aggregation = newAggregation(
            match(
                Criteria.where("deviceId")
                    .is(deviceId)
                    .andOperator(
                        Criteria.where("time").gte(from),
                        Criteria.where("time").lte(to)
                    )
            ),
            group("deviceId")
                .avg("temperature").as("averageTemperature"),
            project("averageTemperature")
    );

    AggregationResults<AverageTemperature> result = mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(YourDocumentClass.class), AverageTemperature.class);
    List<AverageTemperature> mappedResults = result.getMappedResults();
    return (mappedResults != null ? mappedResults.get(0) : null);
}

在上面的示例中,聚合将平均温度计算为BigDecimal。

请注意,默认BigDecimal转换器会在保存时将其映射到mongodb中的字符串。 mapping-conversion

使用Spring数据mongo,我使用的版本不再是一个问题,检索文档应该是一个问题:

  • org.springframework.boot:spring-boot-starter-data-mongodb:jar:2.0.1.RELEASE
  • spring-data-mongodb:jar:2.0.6.RELEASE
  • org.mongodb:mongodb-driver:jar:3.6.3