Cannot deserialize value of type `java.time.LocalDateTime` from String "do ut sit": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text 'do ut sit' could not be parsed at index 0; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.time.LocalDateTime` from String "do ut sit": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text 'do ut sit' could not be parsed at index 0
时间: 2025-07-01 10:06:06 浏览: 7
在处理 `java.time.LocalDateTime` 反序列化时,Jackson 抛出 `InvalidFormatException` 通常是因为输入的字符串格式与预期的日期时间格式不匹配。例如,错误信息 `Text 'do ut sit' could not be parsed at index 0` 表明 Jackson 在尝试解析非法字符串 "do ut sit" 时失败,因为该字符串根本不符合任何标准的日期时间格式。
### 常见原因分析
1. **日期格式不匹配**
Jackson 默认使用 ISO_LOCAL_DATE_TIME 格式(如 `2023-08-16T15:30:00`)来反序列化 `LocalDateTime` 类型。如果 JSON 输入中使用的格式不同,比如 `"2023-08-16 15:30:00"`(中间用空格而非 `T` 分隔),Jackson 将无法正确识别并抛出异常[^1]。
2. **未配置自定义格式注解**
如果 JSON 中的时间格式不是默认的 ISO 标准格式,必须在实体类字段上使用 `@JsonFormat` 注解指定正确的模式。例如:
```java
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", shape = Shape.STRING)
private LocalDateTime createTime;
```
否则 Jackson 将继续尝试使用默认格式进行解析,从而导致失败[^3]。
3. **无效或非法字符输入**
当输入字符串本身是非法的,如完全非数字、乱码或语义不明的文本(如示例中的 `"do ut sit"`),Jackson 自然无法将其解析为合法的 `LocalDateTime` 实例,并抛出 `DateTimeParseException`[^2]。
4. **缺少 Java 8 Date/Time 模块支持**
Jackson 默认并不直接支持 Java 8 的新时间 API(如 `LocalDateTime`)。需要添加额外依赖 `jackson-datatype-jsr310` 才能正确处理这些类型。否则即使格式正确也可能导致反序列化失败。
---
### 解决方案
1. **统一日期格式**
确保前后端传输的日期格式一致,并且在字段上明确标注 `@JsonFormat`,例如:
```java
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
```
2. **添加必要的依赖**
如果尚未引入对 Java 8 时间类型的完整支持,应确保项目中包含以下 Maven 依赖:
```xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.15.2</version>
</dependency>
```
3. **验证输入数据合法性**
对于来自外部系统的数据,应在反序列化前进行格式校验,防止非法字符串进入反序列化流程,避免运行时异常。
4. **自定义反序列化器(可选)**
若需支持多种格式或复杂场景,可以实现自定义的 `JsonDeserializer<LocalDateTime>` 并通过 `@JsonDeserialize(using = MyLocalDateTimeDeserializer.class)` 应用于字段。
---
阅读全文
相关推荐


















