项目场景:

  • SpringBoot项目,前端传来日期时间字段(字符串类型),后端进行逻辑操作处理之前,SpringMvcHttp消息转化时发生的问题。

完整问题描述:

  • Cannot deserialize value of type java.time.LocalDateTime from String “2025-10-14 18:57:32”:
  • Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text ‘2025-10-14 18:57:32’ could not be parsed at index 10(日期和时间之间的空格处)

在这里插入图片描述


问题描述

Spring框架使用的默认使用Jackson,处理日期类型时发生的异常:

  • 错误类型:DateTimeParseException
  • 错误位置:索引 10(日期和时间之间的空格处
  • 错误发生在 Jackson 尝试将 “2025-10-14 18:26:14” 字符串转换为 java.time.LocalDateTime 类型时。

捕获的异常信息

JSON parse error: Cannot deserialize value of type java.time.LocalDateTime from String “2025-10-14 18:26:14”: Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text ‘2025-10-14 18:26:14’ could not be parsed at index 10


原因分析:

  • Spring MVC 采用的消息转换器主要是MappingJackson2HttpMessageConverter
    • 用于处理 HTTP 请求和响应中的数据转换

原因:Jackson 默认使用

  • ISO 格式 (yyyy-MM-ddTHH:mm:ss) 解析日期时间,
  • 你的数据使用的是 yyyy-MM-dd HH:mm:ss 格式

解决方案:

1、全局配置 Jackson(复杂一些)

通过 配置类 来统一处理 LocalDateTime 的序列化和反序列化:

  • HTTP 消息转换器集成
  • Spring MVC 使用 Jackson2ObjectMapperBuilder 来构建 ObjectMapper
  • 自定义的 ObjectMapper 会被 MappingJackson2HttpMessageConverter 使用
  • 该转换器负责处理 HTTP 请求/响应中的 JSON 数据转换

依赖导入

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.15.3</version> <!-- 版本根据项目调整 -->
</dependency>

Jackson配置类

@Configuration
public class JacksonConfig {
    //自定义的 ObjectMapper 会被 MappingJackson2HttpMessageConverter 使用
    //@Primary 注解的作用是:标记某个 Bean 为“首选”Bean。
    @Bean
    @Primary
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        //注册后,Jackson 就能正确地将 LocalDateTime 等类型序列化为标准的 ISO 格式字符串
        mapper.registerModule(new JavaTimeModule());
//Jackson 将不再使用时间戳,而是使用 ISO-8601 格式的字符串 来序列化日期时间        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        
        // 添加自定义 LocalDateTime 反序列化器
        SimpleModule module = new SimpleModule();
        module.addDeserializer(LocalDateTime.class, 
            new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        module.addSerializer(LocalDateTime.class,
            new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        //注册序列化器模块
        mapper.registerModule(module);
        
        return mapper;
    }
}

2、注解方式 —— @JsonFormat (简单)

package com.crocodileQ.service.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDateTime;

/**
 * 传感器数据对象 
 * @author crocodilePole
 * @date 2025-10-11
 */
@Data
public class SensorData extends BaseEntity
{
        private static final long serialVersionUID = 1L;

        /** 主键ID */
        private long id;
        
        /** 采集数据的设备ID */
        private long deviceId;

        /** 设备序列号 */
        private String deviceSn;

        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        private LocalDateTime collectedAt;


}

在这里插入图片描述

总结

  • 以上两种解决方案,可以根据项目需要进行选择。

额外了解

Spring MVC 采用的消息转换器主要是

  • HttpMessageConverter 接口的实现类
  • 用于处理 HTTP 请求和响应中的数据转换。

主要的消息转换器包括:

消息转换器 描述
MappingJackson2HttpMessageConverter 处理 JSON 格式的数据转换 使用 ObjectMapper 进行序列化和反序列化
StringHttpMessageConverter 处理字符串类型的数据转换
ByteArrayHttpMessageConverter 处理字节数组类型的数据转换
ResourceHttpMessageConverter 处理资源文件类型的数据转换
SourceHttpMessageConverter 处理 XML Source 类型的数据转换

工作原理:
Spring MVC 会自动注册这些消息转换器

  • 根据 HTTP 请求头的 Content-Type 和 Accept 字段
  • 选择合适的消息转换器进行数据处理
  • 对于 JSON 数据,主要使用 MappingJackson2HttpMessageConverter

这里是 鳄鱼杆的空间,钓……鳄鱼的杆儿!

期待下次再会!

愿你的每一次垂钓之旅都能满载而归。

在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐