【问题标题】:Mapping BIGDECIMAL from Mongo, lack CONSTRUCTOR从 Mongo 映射 BIGDECIMAL,缺少 CONSTRUCTOR
【发布时间】:2014-11-24 12:55:25
【问题描述】:

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

我在 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。

有人可以帮助我吗?

谢谢!!!!

【问题讨论】:

    标签: json spring mongodb spring-data-mongodb


    【解决方案1】:

    这是一个老问题,但我在使用 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 data 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      相关资源
      最近更新 更多