当前位置: 首页 > 知识库问答 >
问题:

Spring Mongo聚合与LocalDateTime问题

包德业
2023-03-14

原因:org.bson.codecs.configuration.codecConfigurationException:找不到java.time.LocalDateTime类的编解码器。

使用下面的代码

@SpringBootApplication
public class MongojavatimeApplication implements CommandLineRunner {

    @Autowired
    private MongoTemplate template;

    public static void main(String[] args) {
        SpringApplication.run(MongojavatimeApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        Criteria c = Criteria.where("createdDate").gt(LocalDateTime.now().minusDays(30));
        template.aggregate(Aggregation.newAggregation(Aggregation.match(c)), "TestJavaTime", TestJavaTime.class);
    }
}

您将在这里找到很少的测试,LocalDateTime可以很好地使用Spring存储库,这是使用MongoTemplate使用Criteria API的经典查询,但在创建聚合查询时会引发此错误。https://github.com/farael49/spring-mongo-aggrege-localdateTime

共有1个答案

冉子石
2023-03-14

如果要直接使用LocalDateTime,则应提供如下所示的编解码器:

public enum LocalDateTimeCodec
        implements Codec<LocalDateTime> {

    INSTANCE;

    @Override
    public void encode(
            BsonWriter writer,
            LocalDateTime value,
            EncoderContext encoderContext) {

        writer.writeDateTime(
                value.toInstant(ZoneOffset.UTC)
                     .toEpochMilli()
        );
    }

    @Override
    public LocalDateTime decode(
            BsonReader reader,
            DecoderContext decoderContext) {

        return Instant.ofEpochMilli(reader.readDateTime())
                .atOffset(ZoneOffset.UTC)
                .toLocalDateTime();
    }

    @Override
    public Class<LocalDateTime> getEncoderClass() {
        return LocalDateTime.class;
    }
}

您可以通过以下方式注册:

@Bean
public MongoDbFactory mongoDbFactory() throws Exception {
    CodecRegistry registry = CodecRegistries.fromRegistries(
        CodecRegistries.fromCodecs(LocalDateTimeCodec.INSTANCE),
        MongoClient.getDefaultCodecRegistry()
    );
    MongoClientOptions options = MongoClientOptions
        .builder()
        .codecRegistry(registry)
        .build();
    return new SimpleMongoDbFactory(new MongoClient(host, options), dbName);
}

其中hostdbname可能是某个配置类的autowired字段。

 类似资料:
  • 我想获取已批准、已审查和真实记录即。 以下 MONGO 聚合查询返回正确的结果 如何在Springmongo数据db中实现上述查询?Spring Project操作与ArrayOperators.Filter.filter不提供链接操作做和另一个条件。

  • 统计 BuguDao提供如下常用的统计功能,它们都是基于Aggregation实现的。 /* 求最大值 */ public double max(String key) public double max(String key, BuguQuery query) /* 求最小值 */ public double min(String key) public double min(Stri

  • 我在读一篇关于OOP中的关系、关联、组合、聚合等的文章。有些事情令人困惑 因此,在PHP中,我们调用以下代码组合 在阅读了几篇关于作文的文章后 以下是组成示例: 因此,根据我的理解,聚合意味着A类的对象可以存在于B类之外,而组合意味着A类生命周期的对象取决于B类。 我正确理解了吗?

  • 问题内容: 我很难理解UML中的组合和聚合之间的区别。有人可以给我一个很好的比较和对比吗?我也很想学习识别代码之间的区别和/或看一个简短的软件/代码示例。 编辑:我问的部分原因是因为我们在工作中正在进行反向文档活动。我们已经编写了代码,但是我们需要返回并为代码创建类图。我们只想正确捕获关联。 问题答案: 聚集与构成之间的区别取决于上下文。 以另一个答案中提到的汽车示例为例-是的,确实汽车尾气可以“

  • 问题内容: 我试图理解这些术语的含义。我举了一些例子,例如: 汇总:Facebook 有一个 用户 组成:facebook 中的 每个用户 都有一个 会话。 协会:人们 使用 浏览器 但是我对 具有 和 使用我的 示例感到困惑。为什么不能是用户 使用 Facebook帐户或Facebook 使用 会话来认证用户? 就OOP而言,这是错误的吗?我在哪里想念这个概念? 问题答案: 该 使用 关系意味着

  • 我在UML中遇到了和关系的一些问题,我确实理解整体/部分关系,所以如果一个类不能没有它的整体而存在,那么它就成为一个强的组合关系,如果它仍然可以没有它的整体而存在,那么它就成为一个弱的聚合关系。 然而,当处理真正的软件需求时,有时会变得更加棘手。我有一个下面的类图,包括所有必要的属性、操作和特性,它们都正确地显示在UML标准中,但是我不确定我的关系: 1 接口和 6 类 有人可以确认我的关系是否正