为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第15天 Java主流框架实战-SSM开发社交网站

标签:
Java

课程名称:Java工程师2022版

课程章节:SSM开发社交网站

课程内容

①疑难杂症:关于解决因DateTime类型被转为LocalTimeDate而出现的序列化的问题

课程收获

      关于数据库中获取Date类型的问题

https://img1.sycdn.imooc.com/6327bc680001163112790192.jpg

控制台报错:

控制台:08:23:07 DEBUG [http-nio-8080-exec-1] o.s.w.s.DispatcherServlet - Failed to complete request: org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class java.time.LocalDateTime]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: com.fu.reader.utils.ResponseUtils["data"]->java.util.LinkedHashMap["evaluations"]->java.util.ArrayList[0]->java.util.LinkedHashMap["create_time"])

 而根据提示进行依赖的添加:

<dependency>
    <
groupId>com.fasterxml.jackson.datatype</groupId>
    <
artifactId>jackson-datatype-jsr310</artifactId>
    <
version>2.13.1</version>
</
dependency>


然而却是将年月日时分秒数据分开打印了下来,在前端处理仍然很麻烦

https://img1.sycdn.imooc.com/6327bca50001161d07630811.jpg

解决方案:

自定义一个LocalTimeDate对象的Json转换器,保证与java.util.Date输出相同的结果即可

1. 自定义LocalTimeDate序列化类

public class CustomLocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
   
public void serialize(LocalDateTime dateTime, JsonGenerator generator, SerializerProvider sp) throws IOException, JsonProcessingException {
       
long time = dateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
        generator.writeNumber(
time);
    }
}


2. 自定义ObjectMapper类

public class CustomObjectMapper extends ObjectMapper {
   
public CustomObjectMapper() {
       
this.registerModule(new JavaTimeModule());
    }
   
public class JavaTimeModule extends SimpleModule {
       
public JavaTimeModule() {
           
super(PackageVersion.VERSION);
           
this.addSerializer(LocalDateTime.class, new CustomLocalDateTimeSerializer());
        }
    }
}


3. 在Spring配置文件中注册ObjectMapper Bean

<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    <
property name="objectMapper">
        <
bean class="com.fu.reader.config.CustomObjectMapper"/>
    </
property>
</
bean>

https://img3.sycdn.imooc.com/6327bcd20001bd1811540507.jpg

输出结果如下:

https://img2.sycdn.imooc.com/6327bd140001eda107490608.jpg

造成该现象的原因:

在MyBaits 3.4.5版本之前数据库Datetime类型(如create_time)的字段数据会被转换为java.util.Date

在MyBatis 3.4.5版本后,会被转化为java.time.LocalDateTime

如果引入了高版本的MyBatis,或者MyBatis-Plus,在Jackson对LocalDateTime对象序列化支持的不好,就会产生上面的异常与处理结果。

(通过右键菜单快速查找依赖的依赖版本)

https://img3.sycdn.imooc.com/6327bd2a0001f44a10340629.jpg

https://img4.sycdn.imooc.com/6327bd3e0001d48910250479.jpg

    如图,MyBatis版本为3.5.10


点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消