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
复制代码
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> {@Overridepublic Long convert(LocalDateTime localDateTime) {return localDateTime.atZone(ZoneOffset.UTC).toInstant().toEpochMilli();}
}
ReadingConverter:将时间戳转换为 LocalDateTime

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

  • 步骤 2:创建读取转换器
    • 定义一个 @ReadingConverter 类,实现 Converter<Long, LocalDateTime> 接口。
    • 使用 ofEpochMilli() 方法将时间戳转换为 Instant,然后使用 atZone()toLocalDateTime() 方法将其转换为 LocalDateTime 对象。
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> {@Overridepublic LocalDateTime convert(Long timestamp) {return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault());}
}
注册自定义转换器

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

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 {@Beanpublic MongoCustomConversions mongoCustomConversions() {return new MongoCustomConversions(Arrays.asList(new LocalDateTimeToTimestampConverter(),new TimestampToLocalDateTimeConverter()));}
}
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 {@Idprivate String id;@Indexedprivate String username;@HashIndexedprivate 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 中实现对特定数据类型的自定义转换,满足复杂数据映射需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/44682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ //练习 14.50 在初始化ex1和ex2的过程中,可能用到哪些类类型的转换序列呢?说明初始化是否正确并解释原因。

C Primer&#xff08;第5版&#xff09; 练习 14.50 练习 14.50 在初始化ex1和ex2的过程中&#xff0c;可能用到哪些类类型的转换序列呢&#xff1f;说明初始化是否正确并解释原因。 struct LongDouble{LongDouble(double 0.0);operator double();operator float(); }; Long…

在 C# .NET 中,首选静态 HashData 方法而不是 ComputeHash

在 .NET 中&#xff0c;哈希处理是一项常见任务&#xff0c;无论是用于数据完整性检查、密码哈希处理还是其他加密目的。传统上&#xff0c;开发人员使用各种哈希算法&#xff08;例如 SHA256、MD5&#xff09;提供的 ComputeHash 方法。但是&#xff0c;随着静态 HashData 方法…

Python面试题:如何在 Python 中解析 XML 文件?

在 Python 中解析 XML 文件可以使用内置的 xml.etree.ElementTree 模块。以下是一个示例&#xff0c;展示了如何使用这个模块解析 XML 文件&#xff1a; 读取 XML 文件&#xff1a; import xml.etree.ElementTree as ET# 读取 XML 文件 tree ET.parse(example.xml) root tr…

springboot+vue项目实战2024第四集修改文章信息

1.添加文章信息 PostMappingpublic Result add(RequestBody Validated Article article){articleService.add(article);return Result.success();}void add(Article article); Override public void add(Article article) {article.setCreateTime(LocalDateTime.now());article…

openssl等库降级到系统原生安装镜像版本

在安装开发库时&#xff0c;看到curl glib2 libcurl openssl库被更新了&#xff0c;这不是我想要的。如下所示&#xff1a; Verifying : curl-8.4.0-5.oe2403.x86_64 29/38 Verifying : curl-8.4.0-3.oe2403.x86_64 …

如何将Docker镜像源更改为阿里云的镜像加速地址

在使用Docker时&#xff0c;尤其是在国内环境下&#xff0c;由于网络原因&#xff0c;从Docker Hub拉取镜像可能会遇到速度较慢的问题。为了提高拉取速度&#xff0c;我们可以将Docker的镜像源更改为阿里云等国内镜像源。下面详细介绍如何获取并配置阿里云的Docker镜像加速地址…

MES系统在装备制造行业核心应用场景介绍

MES软件在企业中有着广泛的应用场景&#xff0c;主要包括生产计划排程、生产过程监控、质量管理、设备管理、库存管理、数据分析等领域。 通过实时监控生产过程、收集数据、进行分析&#xff0c;MES软件可以帮助企业实现生产过程可视化、透明化&#xff0c;提高生产效率&#…

同三维T80006EH2-4K30编码器视频使用操作说明书:高清HDMI编码器,高清SDI编码器,4K超清HDMI编码器,双路4K超高清编码器

同三维T80006EH2-4K30编码器视频使用操作说明书&#xff1a;高清HDMI编码器&#xff0c;高清SDI编码器&#xff0c;4K超清HDMI编码器&#xff0c;双路4K超高清编码器 T80006EH2-4K30编码器 同三维&#xff0c;十多年老品牌&#xff0c;我们一直专注&#xff1a;视频采集卡、视频…

一二三应用开发平台应用开发示例(7)——文档功能实现示例

概述 在完成文件夹配置工作后&#xff0c;接下来配置文档管理系统最核心的管理对象“文档”。 依旧是使用平台低代码配置工作来配置&#xff0c;配置流程跟文件夹的配置是相同的&#xff0c;以下简要说明&#xff0c;重点是新涉及到的功能或注意点。 创建实体 配置模型属性 …

HashMap第7讲——get方法源码分析

HashMap最后一篇啦&#xff0c;下篇就进入ConcurrentHashMap的学习和总结了。 一、简要步骤 HashMap的get方法也比较简单&#xff0c;下面是它的大致步骤&#xff1a; 首先计算key的hash值&#xff0c;并通过hash值定位到在数据中的索引位置。 如果该位置为空&#xff0c;说…

【力扣 73】矩阵置零 C++题解 空间复杂度为O(1)的解决方案(向量+循环+矩阵)

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 示例 2&#xff1a; 输入&…

每个账号设置独立的cookie

如果需要为每个账号设置独立的Cookie&#xff0c;可以在Cookie中包含一个与用户账号相关的唯一标识符。这样&#xff0c;即使在同一台电脑上&#xff0c;不同的账号登录时也会设置不同的Cookie&#xff0c;从而区分不同的用户。以下是实现这一功能的示例代码&#xff1a; // 假…

AT32单片机踩坑记录

最近做个新项目打算使用AT32单片机&#xff08;AT32F403AVGT7&#xff09;&#xff0c;主要是和stm32极度相似&#xff0c;相关开发工具也逐渐完善&#xff0c;想着用个小项目练练手&#xff0c;当然踩坑也是必不可少的。 1.官方是带图形配置软件和IDE的&#xff0c;使用图形配…

开源项目有哪些机遇与挑战?

开源项目在软件开发领域具有许多机遇和挑战&#xff0c;让我们一起来看看&#xff1a; 机遇&#xff1a; 协作与共享&#xff1a; 开源项目鼓励开发者和组织之间的协作与共享&#xff0c;促进了知识和经验的传播。开发者可以通过参与开源项目来学习和提升技能&#xff0c;建立…

Databricks 收购 Tabular 的意义:数据开放框架的胜利

Databricks 宣布收购 Tabular&#xff0c;这是一个由 Apache Iceberg 的原始创建者开发的数据平台&#xff0c;在数据分析行业引发了涟漪。此次收购凸显了开放框架在数据领域日益增长的重要性&#xff0c;预示着数据管理、分析和 AI/ML 计划领域的创新、协作和可访问性的新时代…

数据库的学习(6)

题目&#xff1a; 数据准备创建两张表:部门(dept)和员工(emp)&#xff0c;并插入数据&#xff0c;代码如下create table dept(dept_id int primary key auto_increment comment 部门编号,dept_name char(20)comment部门名称 ); insert into dept (dept_name) values(销售部),(财…

音视频入门基础:H.264专题(11)——计算视频分辨率的公式

一、引言 通过FFmpeg命令可以获取到H.264裸流文件的视频分辨率&#xff1a; 在vlc中也可以获取到视频分辨率&#xff08;vlc底层也使用了FFmpeg进行解码&#xff09;&#xff1a; 所以FFmpeg和vlc是怎样获取到H.264编码的视频的分辨率呢&#xff1f;它们其实是通过SPS中的属性…

深入理解Java并发、线程与等待通知机制

目录 一、基础概念 进程和线程 进程 线程 Java 线程的无处不在 进程间的通信 进程间通信有几种方式&#xff1f; CPU 核心数和线程数的关系 上下文切换&#xff08;Context switch&#xff09; 并行和并发 二、认识 Java 里的线程 Java 程序天生就是多线程的 线程…

华为机考真题 -- 密码解密

题目描述&#xff1a; 给定一段"密文"字符串 s, 其中字符都是经过"密码本"映射的&#xff0c;现需要将"密文"解密并且输出映射的规则 &#xff08;a - i)分别用(1 - 9)表示&#xff1b;(j - z)分别用(10* - 26*)表示约束&#xff1a;映射始终唯…

STM32学习和实践笔记(39):I2C EEPROM实验

1.I2C总线介绍 I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备,是微电子通信控制领域广泛采用的一种总线标准。 它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。I…