org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.util.Date` from String "2023-05-09": expected format "yyyy-MM-dd HH:mm:ss SSS"; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.util.Date` from String "2023-05-09": expected format "yyyy-MM-dd HH:mm:ss SSS" at [Source: (PushbackInputStream); line: 1, column: 355] (through reference chain: com.nja.biz.vo.group.SendGroupVO["notifyTime"])
时间: 2024-04-29 19:19:38 浏览: 272
这是一个 Spring 框架中的异常,原因是在使用 JSON 解析时,无法将字符串 "2023-05-09" 转化为 java.util.Date 类型,因为它的格式不符合预期的格式 "yyyy-MM-dd HH:mm:ss SSS"。这可能是因为你在发送请求时,没有按照指定的日期格式传递日期参数所导致的。你需要在请求中正确地指定日期格式。
相关问题
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.util.Date`
org.springframework.http.converter.HttpMessageNotReadableException是Spring框架中的一个异常类,它表示在处理HTTP消息时发生了不可读的异常。具体来说,当尝试将JSON数据转换为Java对象时,如果无法将JSON中的值反序列化为指定类型(如java.util.Date),就会抛出这个异常。
这个异常通常发生在以下情况下:
1. JSON数据中的日期格式与Java对象中的日期类型不匹配。
2. JSON数据中的日期字符串无法解析为有效的日期。
3. Java对象中的日期类型没有正确配置相应的日期格式转换器。
为了解决这个问题,你可以采取以下几种方法:
1. 确保JSON数据中的日期格式与Java对象中的日期类型匹配。可以使用@JsonFormat注解或者自定义日期格式转换器来指定日期格式。
2. 使用合适的日期格式来解析JSON数据中的日期字符串。可以使用@JsonFormat注解或者自定义日期格式转换器来指定日期格式。
3. 确保Java对象中的日期类型有正确配置相应的日期格式转换器。可以使用@JsonFormat注解或者自定义日期格式转换器来指定日期格式。
Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `com.example.demo.pojo.Users` from Array value (token `JsonToken.START_ARRAY`)]
### 解决 Spring Boot 中 `HttpMessageNotReadableException` 异常的问题
在 Spring Boot 的应用中,当尝试将 JSON 数据映射到 Java 对象时,可能会抛出 `HttpMessageNotReadableException` 异常。这种异常通常发生在客户端发送的数据格式不匹配预期的目标类结构的情况下。例如,在本例中,可能是由于 JSON 数组无法直接反序列化为单一的 `Users` 对象引起的。
---
#### 1. **分析问题原因**
Spring 默认使用 Jackson 库来进行 JSON 和 Java 对象之间的转换。如果控制器方法期望接收的是一个单独的对象实例(如 `Users`),但实际接收到的是一个 JSON 数组,则会发生解析错误。这是因为 Jackson 不知道如何将数组映射到单个对象上[^1]。
```java
@PostMapping("/users")
public ResponseEntity<?> createUser(@RequestBody Users user) {
// 处理逻辑
}
```
假设前端发送了一个类似于 `[{"id":1,"name":"John"},{"id":2,"name":"Doe"}]` 的 JSON 数组,而这里的参数类型是 `Users` 类型而非列表类型(如 `List<Users>`)。此时就会引发 `Cannot deserialize value from array to Users object` 错误。
---
#### 2. **解决方案**
##### (1)调整接口接受参数类型
最简单的修复办法就是更改控制器方法签名以支持接收集合类型的输入数据。例如改为接收 `List<Users>` 或者其他容器形式:
```java
@PostMapping("/users")
public ResponseEntity<?> createUsers(@RequestBody List<Users> users) {
// 批量保存或其他业务逻辑
return ResponseEntity.ok("Success");
}
```
这样就可以正确处理来自客户端的一个 JSON 数组了[^2]。
---
##### (2)自定义反序列化器
如果你确实需要保留原来的函数设计只允许传入单个实体对象而不是数组的话,那么就需要考虑编写自己的 Deserializer 来适配这种情况。下面展示了一种可能的做法:
首先创建一个新的 deserializer 子类继承 AbstractJsonDeserializer 并重写其中的相关方法:
```java
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
public class SingleOrArrayDeserializer<T> extends StdDeserializer<List<T>> {
private Class<T> clazz;
public SingleOrArrayDeserializer(Class<T> clazz) {
super(List.class);
this.clazz = clazz;
}
@Override
public List<T> deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException {
JsonNode node = jp.getCodec().readTree(jp);
if (node.isArray()) {
return ctxt.readValue(node.traverse(), ctxt.getTypeFactory()
.constructCollectionType(List.class, clazz));
} else {
T obj = ctxt.readValue(node.traverse(),
ctxt.constructType(clazz));
return Collections.singletonList(obj);
}
}
}
```
接着注册这个新的 deserializer 到 ObjectMapper 上面去:
```java
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(Users.class,
new SingleOrArrayDeserializer<>(Users.class));
mapper.registerModule(module);
return mapper;
}
```
现在无论你是传递单个 User 还是一系列 Users 都会被正常解释成为 List<User>.
---
##### (3)验证前端请求体格式
最后也别忘了确认一下前端发出的实际 payload 是否符合后端设定的要求。如果是 Angular/React/Vue 等框架构建的应用程序,请仔细检查它们是如何组装 HTTP 请求头以及主体部分的内容的。确保 Content-Type 设置为了 application/json,并且 Body 内容确实是合法有效的 JSON 字符串表示形式[^4]。
---
### 结论
综上所述,针对 `HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type...from Array value` 此类问题,我们有多种途径可以选择加以应对。既可以改变 API 定义使其兼容更多种类别的输入源;也可以深入挖掘 Jackson 框架内部机制定制专属解决方案;还可以回头审视整个通信链路两端是否存在潜在误解之处予以修正。
---
阅读全文
相关推荐









