Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cann

问题

Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.sql.Timestamp` from String "2024-02-20 19:34:16.0": expected format "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"

详细问题

笔者进行Android项目开发,客户端请求所传递参数含Timestamp类型数据,使用com.fasterxml.jackson对JSON数据进行解析,控制台报错,详细报错如下:

2024-02-20 19:34:34.955  WARN 34104 --- [nio-9090-exec-4] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.sql.Timestamp` from String "2024-02-20 19:34:16.0": expected format "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.sql.Timestamp` from String "2024-02-20 19:34:16.0": expected format "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"<EOL> at [Source: (PushbackInputStream); line: 9, column: 19] (through reference chain: com.qingge.springboot.entity.User["createTime"])]

解决方案

将日期格式化:

public static String convertDateFormat(String inputDate) {
        // 定义输入日期格式和输出日期格式
        DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
        DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX");

        // 将输入日期字符串解析为 LocalDateTime 对象
        LocalDateTime dateTime = LocalDateTime.parse(inputDate, inputFormatter);

        // 将 LocalDateTime 对象格式化为输出日期字符串,并指定时区为东八区
        return dateTime.atZone(ZoneId.of("Asia/Shanghai")).format(outputFormatter);
    }

产生原因

问题产生的原因是在客户端向服务器发送请求时,传递的JSON数据中包含了Timestamp类型的数据,并且这些数据的格式与服务器端预期的格式不匹配。具体来说,服务器端期望接收的Timestamp类型数据格式为"yyyy-MM-dd’T’HH:mm:ss.SSS’Z’“,但实际传递的数据格式为"yyyy-MM-dd HH:mm:ss.S”。

由于JSON数据在传输过程中需要进行反序列化操作,服务器端使用Jackson库进行JSON数据的反序列化。然而,Jackson库无法将实际传递的数据格式"yyyy-MM-dd HH:mm:ss.S"转换为服务器端期望的格式"yyyy-MM-dd’T’HH:mm:ss.SSS’Z’",导致反序列化失败,进而抛出了HttpMessageNotReadableException异常。

解决原因

为了解决这个问题,开发者需要在客户端对日期数据进行格式化,将其转换为服务器端期望的格式"yyyy-MM-dd’T’HH:mm:ss.SSS’Z’",以保证数据的一致性和可解析性。上述提供的解决方案中,通过convertDateFormat方法将日期格式化为符合服务器端期望格式的字符串,并且指定时区为东八区(即"Asia/Shanghai"时区),以确保数据的正确性。

参考文献

产生原因与解释原因部分 部分内容参考chatgpt

原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
请添加图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public boolean com.reap.demo.controller.CRUDController.updateById(com.reap.demo.domain.User)] 这个错误信息的含义是请求中缺少了必需的请求体。解析问题时,我们可以看到在后台方法参数上添加了@RequestBody注解,这意味着需要将请求参数封装成User对象,并且需要使用JSON(application/json)格式的数据。 为了解决这个问题,我们可以在Postman中进行如下设置来正常访问并便于调试。 另外,根据提供的代码,我们可以看到在CRUDController类中有一个updateById方法,它接收一个User对象作为参数,并返回一个boolean类型的值。这个方法用于修改用户信息。 综上所述,为了解决这个错误,我们需要确保请求中有正确的请求体,并且使用JSON(application/json)格式的数据。同时,我们还需要检查updateById方法的实现是否正确。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required request body](https://blog.csdn.net/D_Zhou_Sir/article/details/121676615)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞滕人生TYF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值