当前位置: 首页 > news >正文

【SpringCloud】OpenFeign配置时间Decode

文章目录

    • 1.自定义反序列化器
    • 2.配置类与自定义 ObjectMapper
    • 客户端

需求:OpenFeign配置自定义decode,解析http请求返回的时间字符串

1.自定义反序列化器

Date 自定义反序列化器

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;public class MultiFormatDateDeserializer extends JsonDeserializer<Date> {private static final List<String> FORMATS = Arrays.asList("yyyy-MM-dd HH:mm:ss","yyyy-MM-dd'T'HH:mm:ss","yyyy-MM-dd","MM/dd/yyyy","dd-MM-yyyy");@Overridepublic Date deserialize(JsonParser parser, DeserializationContext context) throws IOException {String dateString = parser.getText();for (String format : FORMATS) {try {return new SimpleDateFormat(format).parse(dateString);} catch (ParseException ignored) {// 尝试下一个格式}}System.err.println("Unparseable date: " + dateString);throw new IOException("Unparseable date: " + dateString);}
}

LocalDate 自定义反序列化器

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;public class MultiFormatLocalDateDeserializer extends JsonDeserializer<LocalDate> {private static final List<DateTimeFormatter> FORMATTERS = Arrays.asList(DateTimeFormatter.ISO_LOCAL_DATE,           DateTimeFormatter.ofPattern("MM/dd/yyyy"),   DateTimeFormatter.ofPattern("dd-MM-yyyy"),    DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")  );@Overridepublic LocalDate deserialize(JsonParser parser, DeserializationContext context) throws IOException {String dateString = parser.getText();for (DateTimeFormatter formatter : FORMATTERS) {try {return LocalDate.parse(dateString, formatter);} catch (Exception ignored) {// 尝试下一个格式}}throw new IOException("Unparseable date: " + dateString);}
}

LocalDateTime 自定义反序列化器

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;public class MultiFormatLocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {private static final List<DateTimeFormatter> FORMATTERS = Arrays.asList(DateTimeFormatter.ISO_LOCAL_DATE_TIME,       // yyyy-MM-dd'T'HH:mm:ssDateTimeFormatter.ISO_LOCAL_DATE,            // yyyy-MM-ddDateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm a"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") );@Overridepublic LocalDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException {String dateString = parser.getText();for (DateTimeFormatter formatter : FORMATTERS) {try {return LocalDateTime.parse(dateString, formatter);} catch (Exception ignored) {// 尝试下一个格式}}throw new IOException("Unparseable date: " + dateString);}
}

2.配置类与自定义 ObjectMapper

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import feign.Logger;
import feign.codec.Decoder;
import feign.codec.Encoder;
import feign.jackson.JacksonDecoder;
import feign.jackson.JacksonEncoder;
import org.apache.kafka.common.utils.Java;
import org.springframework.context.annotation.Bean;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;/*** <p>** </p>** @author pengapeng* @since 2024-12-13*/
public class CustomFeignConfig {@Beanpublic ObjectMapper customObjectMapper() {ObjectMapper objectMapper = new ObjectMapper();// 注册 Java 时间模块JavaTimeModule javaTimeModule = new JavaTimeModule();// 注册自定义反序列化器javaTimeModule.addDeserializer(LocalDateTime.class, new MultiFormatLocalDateTimeDeserializer());javaTimeModule.addDeserializer(LocalDate.class, new MultiFormatLocalDateDeserializer());javaTimeModule.addDeserializer(Date.class, new MultiFormatDateDeserializer());objectMapper.registerModule(javaTimeModule);return objectMapper;}@Beanpublic Decoder feignDecoder() {ObjectMapper customObjectMapper = customObjectMapper();System.out.println("Using Custom Decoder with ObjectMapper: " + customObjectMapper);return new JacksonDecoder(customObjectMapper);}@Beanpublic Encoder feignEncoder() {ObjectMapper customObjectMapper = customObjectMapper();System.out.println("Using Custom Encoder with ObjectMapper: " + customObjectMapper);return new JacksonEncoder(customObjectMapper);}@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL;}
}

注意添加feign.jackson的依赖,选择合适的版本,不匹配可能发生错误。

        <dependency><groupId>io.github.openfeign</groupId><artifactId>feign-jackson</artifactId><version>10.4.0</version></dependency>

在这里插入图片描述

客户端

@FeignClient(url = "http://localhost:8088/", name = "test-feign-client",configuration = CustomFeignConfig.class)
public interface TestFeignClient {@GetMapping("/votecms/test/testFeign")TestDO testFeign();
}

测试所用的TestDO类为

@Data
public class TestDO {private String name;private Integer age;private Long id;private Date createTime1;private Date createTime2;private LocalDateTime updateTime;
}

测试时所用版本:SpringBoot 2.3.12.RELEASE、SpringCloud 2.2.1.RELEASE

相关文章:

【SpringCloud】OpenFeign配置时间Decode

文章目录 1.自定义反序列化器2.配置类与自定义 ObjectMapper客户端 需求&#xff1a;OpenFeign配置自定义decode&#xff0c;解析http请求返回的时间字符串 1.自定义反序列化器 Date 自定义反序列化器 import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.j…...

Xerces-C,一个成熟的 C++ XML 解析库!

嗨&#xff0c;大家好&#xff01;我是一行。今天咱们来探索 Xerces-C&#xff0c;它可是 C里超棒的 XML 解析库哦&#xff01;能帮咱轻松处理 XML 数据&#xff0c;在很多数据交互、配置文件读取场景都超实用&#xff0c;快来一起学习使用它的妙招吧。 一、Xerces-C 是什么&am…...

6.2 MapReduce工作原理

MapReduce工作原理涉及将大数据集分割成小块并行处理。Map任务读取数据块并输出中间键值对&#xff0c;而Reduce任务则处理这些排序后的数据以生成最终结果。MapTask工作包括读取数据、应用Map函数、收集输出、内存溢出时写入磁盘以及可选的Combiner局部聚合。ReduceTask工作则…...

一次旧业务系统迁移收缩的经历

单位的一个业务系统&#xff0c;在几年前已经更换了。但旧的系统里面还有很多没有转移过来的数据&#xff0c;虽然普通用户不再需要用旧的系统&#xff0c;但相应部门的管理人员还需要在旧系统查询数据资料&#xff0c;这应该是旧系统向新系统迁移时&#xff0c;数据不彻底&…...

MVC配置文件及位置

配置文件位置 默认位置 WEB-INF目录下&#xff0c;文件名&#xff1a;<servlet-name>-servlet.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi"http://www.w3.…...

如何解决samba服务器共享文件夹不能粘贴文件

sudo vim /etc/samba/smb.conf在samba的配置文件中增加一个选项 writable yes重启Samba服务以使更改生效&#xff1a; sudo service smbd restart...

【中工开发者】鸿蒙商城app

这学期我学习了鸿蒙&#xff0c;想用鸿蒙做一个鸿蒙商城app&#xff0c;来展示一下。 项目环境搭建&#xff1a; 1.开发环境&#xff1a;DevEco Studio2.开发语言&#xff1a;ArkTS3.运行环境&#xff1a;Harmony NEXT base1 软件要求&#xff1a; DevEco Studio 5.0.0 Rel…...

(九)机器学习 - 多项式回归

多项式回归&#xff08;Polynomial Regression&#xff09;是一种回归分析方法&#xff0c;它将自变量 xx 和因变量 yy 之间的关系建模为 nn 次多项式。多项式回归的目的是找到一个 nn 次多项式函数&#xff0c;使得这个函数能够最好地拟合给定的数据点。 多项式回归的数学表达…...

Qt编写区位码gb2312、机内码、国标码————附带详细介绍和编码实现

文章目录 0 背景1 了解编码1.1 ASCII码1.2 机内码、国标码、区位码1.2.1 区位码1.2.2 国标码&#xff08;GB 2312-80&#xff09;1.2.3 汉字机内码&#xff08;GB 2312&#xff09; 1.3 GBK和GB2312的区别2 编码实现2.1 QString数据转QByteArray类型2.1.1 使用QTextCodec2.1.2 …...

linux网络编程 | c | epoll实现IO多路转接服务器

epoll实现IO多路转接服务器 可通过以下视频学习 06-opell函数实现的多路IO转接_哔哩哔哩_bilibili 通过响应式–多路IO转接实现 文章目录 epoll实现IO多路转接服务器1.思路&功能核心思路 2.代码实现multi_epoll_sever.c运行图 1.思路&功能 **功能&#xff1a;**客…...

Source Insight的使用经验汇总

01-Add All"和“Add Tree”有何区别&#xff1f; 在 Source Insight 中&#xff0c;“Add All”和“Add Tree”是两种向项目&#xff08;Project&#xff09;中添加文件的操作选项&#xff0c;它们的区别在于处理文件和目录的方式不同&#xff1a; 1. Add All 范围&am…...

VSCode 报错:rust-analyzer requires glibc >= 2.28 in latest build

报错信息 /home/jake/.vscode-server-insiders/extensions/matklad.rust-analyzer-0.3.953/server/rust-analyzer: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.29 not found (required by /home/jake/.vscode-server-insiders/extensions/matklad.rust-analyzer-0.3.9…...

Android Link to Death 使用

Java侧&#xff1a; 【android学习】使用linkToDeath对AIDL双向死亡监听_unlinktodeath-CSDN博客 Native侧&#xff1a; Service端 using namespace android; class MyService :public IBinder::DeathRecipient{void MyService::binderDied(const wp<IBinder>& wh…...

【C++游记】string的使用和模拟实现

枫の个人主页 你不能改变过去&#xff0c;但你可以改变未来 算法/C/数据结构/C Hello&#xff0c;这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕&#xff0c;我们继续来学习C的内容呀。C是接近底层有比较经典的语言&#xff0c;因此学习起来注定枯燥无味&#xf…...

DockerUI info存在未授权访问漏洞

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

SQL,查询每天最接近指定时间的记录

Oracle 数据库的某表有一列是日期时间类型&#xff0c;每天对应多条数据&#xff1a; td1.1.2024 08:08:0811.1.2024 10:10:1021.1.2024 15:15:1531.1.2024 20:20:2042.1.2024 09:09:0952.1.2024 12:12:1262.1.2024 16:16:16712.12.2024 16:16:168 现在要从每天找出两条记录&…...

ElasticSearch如何做性能优化?

大家好&#xff0c;我是锋哥。今天分享关于【ElasticSearch如何做性能优化&#xff1f;】面试题。希望对大家有帮助&#xff1b; ElasticSearch如何做性能优化&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Elasticsearch 中&#xff0c;性能优化是…...

【Linux】虚拟空间布局模型地址回填数据段合并(万字详解)

Ⅰ、虚拟空间布局模型 理论模型 包括上节的动态库与静态库&#xff0c;加上本节后面两个内容其实都是对gcc的扩展与补充知识&#xff0c;也是需要了解和掌握的知识。在开讲之前&#xff0c;我们先来说一下在32位x86的Linux系统中&#xff0c;虚拟地址空间布局模型&#xff1a…...

const和修饰指针的几种用法

昨天闲着没事去面试了一个C岗位&#xff0c;问了很多基础的东西都没答上来。主要原因是这些知识在硬件资源丰富的pc端用的不多&#xff0c;二来确实很久没温习之前的C相关的知识了。在面试官问了几次类似的问题没有答好的情况下&#xff08;还喜欢问你确不确定&#xff09;&…...

mybatis事务的自动提交与手动提交

MyBatis支持自动提交和手动提交两种事务管理方式。 自动提交事务 MyBatis默认使用自动提交模式&#xff0c;即每个SQL操作都会自动提交到数据库中。这意味着在执行完一条SQL语句后&#xff0c;MyBatis会自动调用commit()方法将更改持久化到数据库。 手动提交事务 可以通过Sq…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...