首页 > 编程语言 >java8 time to json_Java8 LocalDateTime 如何支持yyyy-MM-dd反序列化

java8 time to json_Java8 LocalDateTime 如何支持yyyy-MM-dd反序列化

时间:2023-11-09 18:03:25浏览次数:48  
标签:formatter 转换 CustomLocalDateTimeDeserializer MM dd LocalDateDeserializer LocalDa

其实吧,从你的问题描述来看,我觉得你对于LocalDate LocalDateTime LocalTime之间的区分以及Java8时间API的认识应该足够了,足够可以做一些简单使用的地步了,如果从我们旁观者角度来说,仅仅只是为了改你这个问题,其实之前回答的人都是可以的。

比如上官元恒提到的直接把请求对象中的字段类型由LocalDateTime改为LocalDate,这样肯定是可以的@JsonFormat(pattern = "yyyy年MM月dd日")

LocalDate date;

因为上官元恒在意的是请求报错的问题

而微凉提到的是LocalDate如何转换为LocalDateTime,当然本质上LocalDate和LocalDateTime是不同,这种转换只是一家之言的转换方式,你可以根据自己的业务来做相应的修改或者就这样转也行

总归微凉想提到的是前端只有年月日,但是你数据库是有时分秒的,所以他在意的是前端到入库这个转换过程,相当于对上官元恒的补充

两个回答的结合,应该就可以解决你的问题

但是可以感觉得出来,题主应该很不愿意把LocalDateTime改为LocalDate。

为啥呢?这样改代码改得多啊。因为由于数据库里是timestamp,所以多半实体对象中的类型就是LocalDateTime,因此如果按照这两个回答的方式修改,肯定要多加一层转换了。加在业务层中的转换其实有时候很烦。

要是不转换,直接用jackson全部搞定,岂不是美哉,其他代码都不用修改(当然都保不准请求对象就是实体对象都有可能,所以更不敢改,hhhhh)

这也是为啥题主宁愿不改类型,硬是要用把LocalDateDeserializer塞到LocalDateTime类型头上。

当然我说这些不是埋汰题主哈。。我主要分析一下你的心理,希望能给你一个符合你心理预期的答案。

言归正传,不知道题主说硬使用LocalDateDeserializer这样的骚操作还是不行,这个不行的原因题主有注意么?

我猜可能没注意,其实你使用LocalDateDeserializer这个反序列化操作是成功的,报错的根本原因是类型不匹配,也就是LocalDateDeserializer其实最终把String -> LocalDate,但是转换成功后的LocalDate值需要被放到请求对象中啊,这个放置的操作用的是setter方法,但由于类型不是LocalDateTime么,所以反射操作失败了呗,这是才是失败的原因

所以说LocalDateDeserializer是完全执行成功的,这种做法是可取的,只是呢跟我们后续的setter操作不匹配而已。嘿嘿~ 所以你应该明白我想做啥了吧

没错,咱们自己造一个Deserializer呗,让它返回类型为LocalDateTime不就好么,最后用反射的setter方法执行肯定也不会报错了啊

因为官方是有一个LocalDateTimeDeserializer,所以我们取名就叫CustomLocalDateTimeDeserializer,虽然咱们披着的名字里有LocalDateTime,实际咱们处理的勾当跟LocalDateDeserializer是一致的,只是根据LocalDateDeserializer的处理之后呢,我们再按照题主自己的业务去转化为LocalDateTime即可,我这里就简单采取微凉的方式,直接补齐00:00好了

最终CustomLocalDateTimeDeserializer的效果如下,代码我也放在一个github上吧,不然看起来很别扭(因为我加了很多注释说明,下面的代码去掉了注释)public class CustomLocalDateTimeDeserializer extends LocalDateTimeDeserializer {

private static final long serialVersionUID = 1L;

private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME;

private CustomLocalDateTimeDeserializer() {

super(DEFAULT_FORMATTER);

}

public CustomLocalDateTimeDeserializer(DateTimeFormatter formatter) {

super(formatter);

}

@Override

protected LocalDateTimeDeserializer withDateFormat(DateTimeFormatter formatter) {

return new CustomLocalDateTimeDeserializer(formatter);

}

@Override

public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {

LocalDate localDate = new LocalDateDeserializer(_formatter).deserialize(p, ctxt);

LocalDateTime localDateTime = localDate.atStartOfDay();

return localDateTime;

}

}

最后你使用的时候,当然就简单啦,直接@JsonDeserialize即可@JsonFormat(pattern = "yyyy年MM月dd日")

@JsonDeserialize(using = CustomLocalDateTimeDeserializer.class)

private LocalDateTime someDateTime;


标签:formatter,转换,CustomLocalDateTimeDeserializer,MM,dd,LocalDateDeserializer,LocalDa
From: https://blog.51cto.com/u_16265692/8285029

相关文章

  • Recurrent Marked Temporal Point Processes: Embedding Event History to Vector
    目录概MotivationMarkedTemporalPointProcess代码DuN.,DaiH.,TrivediR.,UpadhyayU.,Gomez-RodriguzeM.andSongL.Recurrentmarkedtemporalpointprocesses:Embeddingeventhistorytovector.KDD,2016.概利用RNN学习强度函数\(\lambda^*\).在往下......
  • /proc/buddyinfo
    在应用程序设计过程中,内存是很重要的资源,而计算机主机的内存资源时有限的。一般而言我们可以申请到的内存是有限的,并不是想申请多大就有多大就可以申请多大的。/proc/buddyinfo文件里,就记录着系统的内存资源。linux内核中使用了buddy算法来管理内存以减少内存碎片的产生,buddy算法......
  • ASP.NET Ajax exception - Two components with the same id can't be added to the a
    There'sacoupleofexceptionstolookoutforwhenyoustartdevelopingcustomASP.NETAjaxclientcontrols. Theyare:MicrosoftJScriptruntimeerror:Sys.InvalidOperationException:Twocomponentswiththesameid'ctl00_MainContentPlaceHold......
  • 'ddlCities' has a SelectedValue which is invalid because it does not exist in th
    this.ddlCities.DataSource=GetAll_List();this.ddlCities.DataTextField="Name";this.ddlCities.DataValueField="Id";this.ddlCities.DataBind();错误:'ddlCities'hasaSelectedValuewhichisinvalidbecauseitdoe......
  • 外汇110网:怎样的交易商模式更赚钱?MM还是ECN/STP
    每天都会有一些新的交易商出现,许多企业家也受到吸引开设交易公司。运营交易经纪公司真的如此赚钱吗?交易经纪可以赚多少钱?对这个问题的简短回答是,交易商可以赚很多钱,但并不像大多数人想象的那么容易。这是一项具有挑战性的业务,涉及正确管理和推广等许多事项。不仅仅是一个网站、一......
  • Java Fastjson反序列化漏洞研究
    一、Fastjson简介Fastjson是阿里巴巴的一个开源项目,在GitHub上开源,使用Apache2.0协议。它是一个支持JavaObject和JSON字符串互相转换的Java库。Fastjson最大的特点在于它的快速,它超越了JackJson、Gson等库。据官方发布的说明,Fastjson从2011年fastjson发布1.1.x版本之后,其性能......
  • pytest + yaml 框架 -58.运行报告总结summary.json
    前言用例运行结束后,在本地生成summary.json文件,总结运行结果。v1.5.1版本更新内容:1.解决参数化,中文在控制台输出问题2.保存用例结果summary.json保存用例结果summary.json命令行执行用例pytest运行结束,在当前目录生成summary.json文件,内容如下{"base_url":"http......
  • 什么是 Microsoft Outlook 的 Addin
    Outlook的Addin,又被称为"Outlook插件",是一种可以扩展和增强Outlook功能的软件工具。插件可以深度集成到Outlook用户界面中,并在用户需要时提供自定义的功能和服务。例如,一个插件可能会提供特定的电子邮件管理功能,如排序、标记、归档或者搜索,或者提供与第三方服务的集成,如日......
  • Uncaught TypeError: Cannot read property ‘addEventListener‘ of null 求助!!!!!!
    今天在项目中遇到个问题如下:vue项目中public的index.html文件script标签引入了一个外部的js文件,里面有一个方法每次调用的时候都会报错UncaughtTypeError:Cannotreadproperty‘addEventListener‘ofnull,网上查的所有办法都试过了:跟标签摆放先后位置,放到onload方法中都没......
  • Balance Addicts 题解
    BalanceAddicts题目大意给定序列\(a\),求有多少种合法的划分方案。定义一种划分方案是合法的当且仅当划分出的各段序列的和构成回文序列。思路分析一种不太一样的做法。我们先对\(a\)做一遍前缀和,得到\(s\)。观察各段序列的和形式:\[s_{p_1},s_{p_2}-s_{p_1},s_{p_3}......