java8 time to json_Java8 LocalDateTime 如何支持yyyy-MM-dd反序列化
  sjr1u1Lqr9Qx 2023年11月15日 57 0

其实吧,从你的问题描述来看,我觉得你对于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;


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

推荐阅读
  anLrwkgbyYZS   2023年12月30日   33   0   0 ideciciMaxideMax
sjr1u1Lqr9Qx