Spring Data MongoDB 自定义转换器:写入和读取 LocalDateTime

Spring Data MongoDB 自定义转换器:写入和读取 LocalDateTime

引言

在使用 Spring Data MongoDB 时,有时需要将特定类型(如 LocalDateTime)与 MongoDB 文档中的特定格式(如时间戳)之间进行自定义转换。本篇博客将介绍如何创建自定义转换器来实现这一功能。

先决条件

读者需具备以下知识:

  • Java、Spring Framework 和 MongoDB 的基础知识。
使用的技术

本文涉及以下技术:

  • Java 8+
  • Spring Boot
  • Spring Data MongoDB
转换器简介

转换器在 Spring Data MongoDB 中的作用:

  • 自定义转换器用于控制 Java 对象与 MongoDB 文档之间的数据转换过程。
WritingConverter:将 LocalDateTime 转换为时间戳

详细解释编写写入转换器的步骤:

  • 步骤 1:创建写入转换器
    • 定义一个 @WritingConverter 类,实现 Converter<LocalDateTime, Long> 接口。
    • 使用 toEpochMilli() 方法将 LocalDateTime 转换为 Epoch 毫秒值。
java 复制代码
java
复制代码
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.WritingConverter;
import java.time.LocalDateTime;
import java.time.ZoneOffset;

@WritingConverter
public class LocalDateTimeToTimestampConverter implements Converter<LocalDateTime, Long> {

    @Override
    public Long convert(LocalDateTime localDateTime) {
        return localDateTime.atZone(ZoneOffset.UTC).toInstant().toEpochMilli();
    }
}
ReadingConverter:将时间戳转换为 LocalDateTime

详细解释编写读取转换器的步骤:

  • 步骤 2:创建读取转换器
    • 定义一个 @ReadingConverter 类,实现 Converter<Long, LocalDateTime> 接口。
    • 使用 ofEpochMilli() 方法将时间戳转换为 Instant,然后使用 atZone() 和 toLocalDateTime() 方法将其转换为 LocalDateTime 对象。
java 复制代码
java
复制代码
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;

@ReadingConverter
public class TimestampToLocalDateTimeConverter implements Converter<Long, LocalDateTime> {

    @Override
    public LocalDateTime convert(Long timestamp) {
        return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault());
    }
}
注册自定义转换器

在 Spring 配置类中注册自定义转换器,以便 Spring Data MongoDB 能够识别并使用它们:

java 复制代码
java
复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
import java.util.Arrays;

@Configuration
public class MongoConfig {

    @Bean
    public MongoCustomConversions mongoCustomConversions() {
        return new MongoCustomConversions(Arrays.asList(
            new LocalDateTimeToTimestampConverter(),
            new TimestampToLocalDateTimeConverter()
        ));
    }
}
java 复制代码
package com.cdn.test.mode;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.HashIndexed;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import org.springframework.data.mongodb.core.mapping.FieldType;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;

/**
 * 蔡定努
 * 2024/07/08 18:42
 */
@Data
@Document
public class Student {

    @Id
    private String id;

    @Indexed
    private String username;

    @HashIndexed
    private String email;

    /**
     *  @Field(targetType = FieldType.DOUBLE)  也能实现简单转换
     */
    @Field(targetType = FieldType.DOUBLE)
    private BigDecimal amount;


    private List<BigDecimal> amount3;

    private Long balance;


    private LocalDateTime date;
}

单独使用@Field(targetType = FieldType.DOUBLE) 也能实现简单转换

结论

总结本文内容:

  • 自定义转换器在 Spring Data MongoDB 中的重要性和使用方法。
  • 如何编写和注册写入和读取转换器,实现 LocalDateTime 与时间戳之间的双向转换。

通过以上步骤,你可以轻松地在 Spring Data MongoDB 中实现对特定数据类型的自定义转换,满足复杂数据映射需求。

相关推荐
三84412 小时前
Fastjson 漏洞 · 02 · autoType 机制与 checkAutoType
java·fastjson
无限码力12 小时前
小红书笔试真题 9.17 - 待发热度重排(C++/Py/Java /Js/Go)
java·小红书·小红书笔试真题·小红书技术岗笔试真题
卓怡学长12 小时前
w194基于ssm新能源汽车充电系统小程序
java·小程序·intellij-idea
JAVA面经实录91712 小时前
Java高级后端 · 全套面试通关手册(MySQL)
java·mysql·面试
光依旧13 小时前
MCP实战手记(八):从“能跑“到“能上线“——无状态MCP Server的生产落地清单
java·人工智能·spring boot·架构·ai agent·mcp
弹简特14 小时前
【Java项目-企悦抽】15-活动管理模块02-活动创建测试与活动列表实现
java·开发语言·springboot
斯内普吖14 小时前
(开源)水果蔬菜商城实战指南 基于 Java + SSM + Vue + MySQL
java·vue.js·mysql·开源
wang_shu_mo_ran14 小时前
Spring IoC和DI概念篇
java·后端·spring
小狼1545414 小时前
拼多多订单数据导出 CSV 实战:接口分页、字段平铺与 5 个数据坑,多多开票助手
java·前端·javascript