东八区的 springboot 如何配置序列化
东八区的 springboot 🚞
- 使用SpringBoot默认配置
- 自定义配置类
- 自定义 ObjectMapper
- 自定义序列化器
- 总结
我接受它的苦,它的灰暗,它的刺,因为总会过去,我的花会开,生活也会慢慢拥抱我
使用SpringBoot默认配置
SpringBoot默认使用UTC时间,如果我们需要使用东八区时间,可以使用以下配置:
spring:jackson:time-zone: GMT+8
这种方式是最简单的方式,不需要任何额外的依赖和代码,但是需要注意的是,该配置是全局生效的,可能会影响到其他需要使用UTC时间的地方,而且每次新增依赖、升级SpringBoot版本等情况都需要再次检查该配置是否正确。
自定义配置类
另外一种方式是自定义配置类,使用@Configuration注解创建一个配置类,然后在该类中配置Jackson2ObjectMapperBuilderCustomizer,指定时区为东八区。
@Configuration
public class JacksonConfiguration {@Beanpublic Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {return builder -> builder.timeZone(TimeZone.getTimeZone("GMT+8"));}
}
这种方式需要自定义代码,但是可以更加灵活地控制使用东八区时间的范围,而且不会影响到其他需要使用UTC时间的地方。但是同样需要注意每次新增依赖、升级SpringBoot版本等情况都需要再次检查该配置是否正确。
自定义 ObjectMapper
也可以通过自定义 Jackson 的 ObjectMapper 来使用东八区时间。
具体实现方式是,在 ObjectMapper 上设置一个自定义的 JavaTimeModule,然后在该模块上设置时区为东八区。
示例代码如下:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;public class CustomObjectMapper extends ObjectMapper {public CustomObjectMapper() {JavaTimeModule javaTimeModule = new JavaTimeModule();javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ISO_LOCAL_DATE_TIME));javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ISO_LOCAL_DATE_TIME));this.registerModule(javaTimeModule);this.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));}
}
在上面的示例中,我们创建了一个继承自 ObjectMapper 的 CustomObjectMapper,并在该对象上注册了一个自定义的 JavaTimeModule,该模块的序列化和反序列化方式分别使用了 LocalDateTimeSerializer 和 LocalDateTimeDeserializer,同时将时区设置为 Asia/Shanghai。你也可以根据需要添加其他的时间序列化和反序列化方式。
在代码中使用自定义的 CustomObjectMapper 对象进行序列化和反序列化即可使用东八区时间。例如:
CustomObjectMapper objectMapper = new CustomObjectMapper();
String jsonString = objectMapper.writeValueAsString(yourObject);
YourObject deserializedObject = objectMapper.readValue(jsonString, YourObject.class);
值得注意的是,如果你需要在 Spring Boot 中使用自定义的 ObjectMapper,则需要在配置类中进行相关配置:
@Configuration
public class JacksonConfig {@Beanpublic ObjectMapper objectMapper() {return new CustomObjectMapper();}
}
这样配置之后,在代码中使用 @Autowired 注入该 ObjectMapper 对象即可
自定义序列化器
第三种方式是自定义序列化器,在序列化的过程中将时间转换为东八区时间。需要实现JsonSerializer接口,然后在@JsonSerialize注解中指定该序列化器。具体代码如下:
public class ChinaZoneDateTimeSerializer extends JsonSerializer<ZonedDateTime> {@Overridepublic void serialize(ZonedDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {gen.writeString(value.withZoneSameInstant(ZoneId.of("GMT+8")).format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));}
}
然后在需要序列化的对象的时间字段上使用@JsonSerialize注解,指定该序列化器。
@JsonSerialize(using = ChinaZoneDateTimeSerializer.class)
private ZonedDateTime createTime;
这种方式可以更加灵活地控制时间的格式和转换逻辑,但是需要自定义代码,而且对每个需要转换的时间字段都需要添加@JsonSerialize注解,有一定的代码侵入性。
总结
对于使用东八区时间的配置,不同的方式各有优劣,具体如下:
- 在代码中手动指定时区
优点:简单明了,没有额外的依赖
缺点:每次使用时都需要手动指定时区,不便于维护和修改。
- 在 Spring Boot 的 application.properties/yaml 中配置
优点:配置简单,在代码中直接使用自动装配的组件即可
缺点:如果有多个模块需要使用不同的时区,需要在不同的模块中分别进行配置
- 自定义 Jackson 的 ObjectMapper
优点:在多个模块中都可以使用同一种方式来进行配置,方便维护和修改
缺点:需要额外的依赖,并且需要对 Jackson 的序列化和反序列化机制有一定的了解。
综上所述,三种方式各有优缺点,需要根据实际需求和情况选择合适的方式。若是只需要使用全局东八区时间,可以选择使用SpringBoot默认配置;若是需要更加灵活地控制使用东八区时间的范围,可以选择自定义配置类;若是需要更加灵活地控制时间的格式和转换逻辑,可以选择自定义序列化器。
相关文章:
东八区的 springboot 如何配置序列化
东八区的 springboot 🚞使用SpringBoot默认配置自定义配置类自定义 ObjectMapper自定义序列化器总结我接受它的苦,它的灰暗,它的刺,因为总会过去,我的花会开,生活也会慢慢拥抱我 使用SpringBoot默认配置 S…...
论文阅读_LLaMA
论文信息 number headings: auto, first-level 2, max 4, _.1.1 name_en: LLaMA: Open and Efficient Foundation Language Models name_ch: LLaMA: 开放高效的基础语言模型 paper_addr: https://arxiv.org/abs/2302.13971 doi: https://doi.org/10.48550/arXiv.2302.13971 da…...
腾讯空降测试工程师,绩效次次拿S,真是砂纸擦屁股,给我露了一手啊
上周我们公司的绩效面谈全部结束了,每年到这个时间点就是打绩效的时候了,对于职场打工人来说绩效绝对是最重要的事情之一,原因也很简单:奖金、晋升、涨薪都和它有关系。 比如下面这个美团员工在脉脉上的自曝就很凄凉࿱…...
真题详解(计算机总线)-软件设计(四十五)
真题详解(二维数组)-软件设计(四十四)https://blog.csdn.net/ke1ying/article/details/130023062 1、2016年下半年 解析: A选项,当B中的两个结束都到达,会转到C2,因为C2没有事件&a…...
剪格子
[蓝桥杯 2013 省 A] 剪格子 题目描述 如图 111 所示,333\times 333 的格子中填写了一些整数。 我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是 606060。 本题的要求就是请你编程判定:对给定的 mnm\times nmn 的格…...
【Nowcoder-BC146.添加逗号 -OR63.删除公共字符】
Nowcoder-BC146.-OR63.Nowcoder-BC146.添加逗号Nowcoder-OR63.删除公共字符Nowcoder-BC146.添加逗号 题目:对于一个较大的整数 N(1<N<2,000,000,000) 比如 980364535,我们常常需要一位一位数这个数字是几位数,但是如果在这个数字每三位…...
能自动摊铺施工的公路滑模机多少钱一台
滑模机是能在公路施工现场进现场自动摊铺作业的设备,让路缘石经过设备制作一次性完成施工工序,整体成型一次完成。这样的使用流程整体包含了几个大的关键步骤,分别是测量后放置标示线-设备进场就位-原材料运输和供应-滑模机摊铺作业-后续伸缩…...
ChatGPT热潮下,因生成式AI失业的人出现,我成了第一批失业的人
近几个月来,越来越多的知名人士预计,年内大热的ChatGPT有望掀起一场新的工业革命。而纵观历史,历次工业革命往往会深远改变当时的社会结构——从机械织布机到内燃机再到第一台计算机,新技术的出现总是会引起人们对于被机器取代的恐…...
TypeScript01-基础知识
基础类型 boolean 类型 let isDone: boolean false; // ES5:var isDone false;number 类型 let count: number 10; // ES5:var count 10;string 类型 let name: string "semliker"; // ES5:var name semlinker;Symbol 类…...
【Redis学习】Redis安装配置
Linux 安装环境必须先具备gcc编译环境 版本选择 查看自己redis版本的命令 安全Bug按照官网提示,升级成为6.0.8及以上 目前建议都需要升级到6.0.8版本以上 本次我们用Redis7.0 Redis7安装步骤 下载获得redis-7.0.0.tar.gz后将它放入Linux目录/opt /opt目录下解…...
leetcode160:相交链表
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后…...
基于Prometheus的jvm监控指标详解
使用Prometheus 监控Springboot应用参考 Prometheus Operator实战—— Prometheus、Alertmanager、Grafana 监控Springboot服务 下面来看看jvm的监控指标 # HELP jvm_gc_collection_seconds Time spent in a given JVM garbage collector in seconds. # TYPE jvm_gc_collection…...
C程序设计语言基础
机器语言与高级语言 计算机硬件只能够识别电平信号,正电平或负电平,计算机的的各种按钮触发各种电平与计算机交互。随着随着操作系统的发展,人们用1,0分别表示正电平和负电平,并由0,1所组成的一系列指令指…...
构建同一局域网下文件共享网页
首先,我会将这个内容分成以下步骤: 目录 1. 安装必要的软件和工具 2. 搭建本地服务器 3. 编写账号系统和登录页面 4. 实现多人登录 5. 实现文件上传和共享功能 以下是每个步骤的详细说明和代码示例。 1. 安装必要的软件和工具 为了完成这个项目&…...
程序员未来是不是会大量失业?
程序员宝藏库:https://gitee.com/sharetech_lee/CS-Books-Store 会,但是主要原因并不是来自最近爆火的AIGC。 生成式AI对比与传统的工具的确很强大,但是要说替代某种工作岗位还为时尚早。最近铺天盖地的相关推文,热度一波未平又起…...
解密普元大文件传输平台新版本21种特性
本文主要介绍大文件传输平台及其传输特性,以平台版本升级为切入点,探讨大文件传输平台对多种传输场景的支持及部署管控方面能力的增强。目 录01 普元大文件传输平台02 普元文件传输平台新版本特性03 信创项目案例04 总结01普元大…...
每日一问-ChapGPT-20230406-中医基础-脉诊
文章目录每日一问-ChapGPT系列起因每日一问-ChapGPT-20230406-中医基础-脉诊脉诊脉诊的左右手脉诊拓展01沉脉:02迟脉:03促脉:04代脉:05动脉:06短脉:07伏脉:08浮脉:09革脉:10洪脉:11滑脉:12缓脉:13疾脉:14结脉:15紧脉:16芤脉:17散脉:18牢脉:19弦脉:20弱脉:21濡脉:22细脉:23微脉:…...
Nuxt项目asyncData服务端请求数据渲染
或许有些人会比较喜欢在mounted里去请求数据 但在Nuxt项目中是绝对不能这样操作的 因为 mounted的特性也说的比较明白了 当页面挂载完之后执行 但显然 seo只读你页面挂载的内容 如果你在这请求 那么对不起 你请求回来的数据渲染到界面上seo爬虫是看不到的 Nuxt项目请求数据 可…...
Vue 13 - 列表渲染 v-for
V-for介绍 当使用Vue.js框架时,可以使用v-for指令对数据进行循环遍历并渲染到模板中。v-for可以遍历数组、对象、字符串、指定次数等。 以下是v-for的用法: 遍历数组 <div v-for"(item, index) in items" :key"index"> {{…...
XML复习
目录什么是XMLXML中的内容可以干什么XML文件的创建以及其格式XML的文档约束-DTD约数XML的文档约束-schema约束Dom4J 解析XML 文档什么是XML XML 全称(extensible Markup Lanage) 可扩展标记语言它是一种数据的表示形式, 可以存储复杂的数据格式以及我们自己定义的格式.XML经常…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
