使用LocalDateTime的Spring数据mongodb聚合找不到类java.time.LocalDateTime的编解码器

时间:2018-04-12 10:23:18

标签: java mongodb spring-boot aggregation-framework spring-data-mongodb

在示例项目中,我可以成功存储此Bean:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Refrigerator {

    @Indexed
    private String deviceId;
    private String vendor;
    private LocalDateTime time;
    private Integer temperature;
    private Integer spoiledItems;

}

到这个文件:

{
    "_id": ObjectId("5acf302bd824ae010c55f3f0"),
    "deviceId": "myId",
    "time": ISODate("2018-04-07T10:08:40.921Z"),
    "temperature": 5,
    "_class": "com.github.paizo.monitorapi.model.Refrigerator"
}

但执行以下聚合操作失败:

@Override
public AverageTemperature averageTemperatureByDeviceIdAndDateRange(String deviceId, LocalDateTime from, LocalDateTime 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")
                    .addToSet("deviceId").as("deviceId"),
            project("deviceId", "averageTemperature")
    );

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

相同的查询没有涉及日期成功,这是堆栈跟踪:

DEBUG o.s.data.mongodb.core.MongoTemplate - Executing aggregation: { "aggregate" : "refrigerator", "pipeline" : [ { "$match" : { "deviceId" : "myId", "$and" : [ { "time" : { "$gte" : { "$java" : 2018-04-02T12:08:40.921 } } }, { "time" : { "$lte" : { "$java" : 2018-04-22T12:08:40.921 } } } ] } }, { "$group" : { "_id" : "$deviceId", "averageTemperature" : { "$avg" : "$temperature" }, "deviceId" : { "$addToSet" : "$deviceId" } } }, { "$project" : { "deviceId" : 1, "averageTemperature" : 1 } } ], "cursor" : { "batchSize" : 2147483647 } }

org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class java.time.LocalDateTime.

at org.bson.codecs.configuration.CodecCache.getOrThrow(CodecCache.java:46)
at org.bson.codecs.configuration.ProvidersCodecRegistry.get(ProvidersCodecRegistry.java:63)
at org.bson.codecs.configuration.ChildCodecRegistry.get(ChildCodecRegistry.java:51)
at org.bson.codecs.DocumentCodec.writeValue(DocumentCodec.java:184)
at org.bson.codecs.DocumentCodec.writeMap(DocumentCodec.java:199)
at org.bson.codecs.DocumentCodec.writeValue(DocumentCodec.java:182)
at org.bson.codecs.DocumentCodec.writeMap(DocumentCodec.java:199)
at org.bson.codecs.DocumentCodec.writeValue(DocumentCodec.java:182)
at org.bson.codecs.DocumentCodec.writeIterable(DocumentCodec.java:207)
at org.bson.codecs.DocumentCodec.writeValue(DocumentCodec.java:180)
at org.bson.codecs.DocumentCodec.writeMap(DocumentCodec.java:199)
at org.bson.codecs.DocumentCodec.writeValue(DocumentCodec.java:182)
at org.bson.codecs.DocumentCodec.writeMap(DocumentCodec.java:199)
at org.bson.codecs.DocumentCodec.writeValue(DocumentCodec.java:182)
at org.bson.codecs.DocumentCodec.writeIterable(DocumentCodec.java:207)
at org.bson.codecs.DocumentCodec.writeValue(DocumentCodec.java:180)
at org.bson.codecs.DocumentCodec.writeMap(DocumentCodec.java:199)
at org.bson.codecs.DocumentCodec.encode(DocumentCodec.java:141)
at org.bson.codecs.DocumentCodec.encode(DocumentCodec.java:45)
at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:63)
at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:29)
at com.mongodb.connection.RequestMessage.addDocument(RequestMessage.java:247)
at com.mongodb.connection.RequestMessage.addDocument(RequestMessage.java:197)
at com.mongodb.connection.CommandMessage.encodeMessageBodyWithMetadata(CommandMessage.java:126)
at com.mongodb.connection.RequestMessage.encode(RequestMessage.java:147)
at com.mongodb.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:245)
at com.mongodb.connection.UsageTrackingInternalConnection.sendAndReceive(UsageTrackingInternalConnection.java:98)
at com.mongodb.connection.DefaultConnectionPool$PooledConnection.sendAndReceive(DefaultConnectionPool.java:441)
at com.mongodb.connection.CommandProtocolImpl.execute(CommandProtocolImpl.java:80)
at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:189)
at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:264)
at com.mongodb.connection.DefaultServerConnection.command(DefaultServerConnection.java:126)
at com.mongodb.connection.DefaultServerConnection.command(DefaultServerConnection.java:118)
at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:226)
at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:197)
at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:189)
at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:99)
at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:92)
at com.mongodb.operation.CommandReadOperation.execute(CommandReadOperation.java:55)
at com.mongodb.Mongo$3.execute(Mongo.java:826)
at com.mongodb.MongoDatabaseImpl.executeCommand(MongoDatabaseImpl.java:166)
at com.mongodb.MongoDatabaseImpl.runCommand(MongoDatabaseImpl.java:138)
at com.mongodb.MongoDatabaseImpl.runCommand(MongoDatabaseImpl.java:133)
at org.springframework.data.mongodb.core.MongoTemplate$4.doInDB(MongoTemplate.java:440)
at org.springframework.data.mongodb.core.MongoTemplate$4.doInDB(MongoTemplate.java:437)
at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:497)
at org.springframework.data.mongodb.core.MongoTemplate.executeCommand(MongoTemplate.java:437)
at org.springframework.data.mongodb.core.MongoTemplate$BatchAggregationLoader.aggregateBatched(MongoTemplate.java:3137)
at org.springframework.data.mongodb.core.MongoTemplate$BatchAggregationLoader.aggregate(MongoTemplate.java:3113)
at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1937)
at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1841)

我发现了与LocalDateTime和聚合函数问题相关的其他问题但是转换器应该已经存在,因为DATAMONGO-1102中包含Jsr310Converters我是否真的必须回退到标准Date键入或我必须覆盖转换器?如果它是聚合框架中的限制,我该如何解决它呢?

我使用的是Spring Boot 2.0.1.RELEASE

0 个答案:

没有答案