当前位置:首页 > 科技  > 软件

Spring Boot:玩转日期时间类型参数转换技巧

来源: 责编: 时间:2024-01-10 09:35:16 323观看
导读前言在实际使用Spring MVC开发java web项目的过程中,前端调用后端的接口时,通常是以json报文的格式传递到后台,spring会对抆参数进行解析最后映射到controller层方法中。而日期类型参数前端传递过来通常是yyyy-MM-dd或yy

前言

在实际使用Spring MVC开发java web项目的过程中,前端调用后端的接口时,通常是以json报文的格式传递到后台,spring会对抆参数进行解析最后映射到controller层方法中。而日期类型参数前端传递过来通常是yyyy-MM-dd或yyyy-MMdd HH:mm:ss格式的字符串,而接收参数的对象中往往是LocalDate、LocalDateTime、Date,映射的时候经常会出现异常报错,这篇文章用一个小例子来分享遇到这种情况是应该是如何解决?Tnr28资讯网——每日最新资讯28at.com

常用的日期类型

java.time.LocalDate;Tnr28资讯网——每日最新资讯28at.com

java.time.LocalDateTime;Tnr28资讯网——每日最新资讯28at.com

java.util.Date;Tnr28资讯网——每日最新资讯28at.com

完成目标

前台传递到后台一个字符类型的日期(yyyy-MM-dd),后台使用LocalDate来接收,并且返回值中格式与传入相同。Tnr28资讯网——每日最新资讯28at.com

前台传递到后台一个字符类型的日期时间(yyyy-MM-dd HH:mm:ss),后台怎么使用LocalDateTime来接收,并且返回值中格式与传入相同。Tnr28资讯网——每日最新资讯28at.com

前台传递到后台一个字符类型的日期时间(yyyy-MM-dd HH:mm:ss),后台怎么使用java.util.Date来接收,并且返回值中格式与传入相同。Tnr28资讯网——每日最新资讯28at.com

具体实现方法

1、java.util.Date类型的日期的类型转移与格式化使用@JsonFormat即可解决;对于LocalDate与LocalDateTime类型的需要全局配置自定义类型转换器;Tnr28资讯网——每日最新资讯28at.com

2、对于LoclDateTime类型的参数,在序列化与反序列化的时候会有异常,通过Jackson2ObjectMapperBuilderCustomizer自定义一下LocalDate和LocalDateTime两种类型的序列化处理器即可解决这个异常;Tnr28资讯网——每日最新资讯28at.com

JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime` Failed to deserialize java.time.LocalDateTime nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.time.LocalDateTime`

日期格式转换器配置

  • LocalDateConverter方法使用Converter接口实现了一个将字符串转换为LocalDate对象的转换器。它使用LocalDate.parse方法将传入的字符串按照"yyyy-MM-dd"的格式解析成LocalDate对象。
  • LocalDateTimeConverter方法也使用Converter接口实现了一个将字符串转换为LocalDateTime对象的转换器。它使用LocalDateTime.parse方法将传入的字符串按照"yyyy-MM-dd HH:mm:ss"的格式解析成LocalDateTime对象。
  • jsonCustomizer方法定义了一个Jackson2ObjectMapperBuilderCustomizer对象,该对象用于自定义Jackson库的配置。首先,它创建了一个JavaTimeModule对象,用于支持Java 8日期时间类的序列化和反序列化。然后,它创建了一个LocalDateTimeDeserializer对象,用于将字符串按照"yyyy-MM-dd HH:mm:ss"的格式反序列化成LocalDateTime对象。最后,它使用Jackson2ObjectMapperBuilder的方法设置了日期时间格式和序列化器,并将JavaTimeModule模块添加到构建器中。
@Bean    public Converter<String, LocalDate> LocalDateConverter() {        return new Converter<String, LocalDate>() {            @Override            public LocalDate convert(String source) {                return LocalDate.parse(source, DateTimeFormatter.ofPattern("yyyy-MM-dd"));            }        };    }    @Bean    @ConditionalOnBean(name = "requestMappingHandlerAdapter")    public Converter<String, LocalDateTime> LocalDateTimeConverter() {        return new Converter<String, LocalDateTime>() {            @Override            public LocalDateTime convert(String source) {                return LocalDateTime.parse(source, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));            }        };    }    @Bean    public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {        JavaTimeModule module = new JavaTimeModule();        LocalDateTimeDeserializer localDateTimeDeserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));        module.addDeserializer(LocalDateTime.class, localDateTimeDeserializer);        return new Jackson2ObjectMapperBuilderCustomizer() {            @Override            public void customize(Jackson2ObjectMapperBuilder builder) {                builder.simpleDateFormat("yyyy-MM-dd HH:mm:ss");                builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));                builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));                builder.modules(module);            }        };    }}

接收参数对象配置

@Datapublic class Person implements Serializable {    private String perName;    private LocalDate born;    private LocalDateTime loginTime;    @JsonFormat(pattern = "yyyy-MM-dd")    private Date date1;    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")    private Date date2;    private List<LocalDate> localDates;    private List<LocalDateTime> localDateTimes;    @JsonFormat(pattern = "yyyy-MM-dd")    private List<Date> dates;    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")    private List<Date> dateTimes;}

controller层方法接收参数

@RestController@RequestMapping("/date")public class DateConvertController {    @PostMapping("/conTest")    public Person conTest(@RequestBody Person person){        System.out.println("姓名:"+person.getPerName()+",出生日期:"+person.getBorn()+",登入时间:"+person.getLoginTime());        return person;    }}


Tnr28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-59648-0.htmlSpring Boot:玩转日期时间类型参数转换技巧

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 性能工程成熟度模型

下一篇: Redis发布订阅,右手就行!

标签:
  • 热门焦点
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • 六大权益!华为8月服务日开启:手机免费贴膜、维修免人工费

    8月5日消息,一年一度的华为开发者大会2023(Together)日前在松山湖拉开帷幕,与此同时,华为8月服务日也式开启,到店可享六大专属权益。华为用户可在华为商城Ap
  • Automa-通过连接块来自动化你的浏览器

    1、前言通过浏览器插件可实现自动化脚本的录制与编写,具有代表性的工具就是:Selenium IDE、Katalon Recorder,对于简单的业务来说可快速实现自动化的上手工作。Selenium IDEKat
  • 如何通过Python线程池实现异步编程?

    线程池的概念和基本原理线程池是一种并发处理机制,它可以在程序启动时创建一组线程,并将它们置于等待任务的状态。当任务到达时,线程池中的某个线程会被唤醒并执行任务,执行完任
  • 在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
Top