• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
思想人生从关注生活开始
博客园    首页    新随笔    联系   管理    订阅  订阅

org.springframework.http.converter.HttpMessageNotReadableException

今天我们要探讨一个常见的错误:`org.springframework.http.converter.HttpMessageNotReadableException.` 这个错误通常在处理RESTful请求的时候出现,表示某个请求的HTTP消息不能被读取。它通常是由于客户端和服务器端之间的非法或不一致的数据传输引起的。那么接下来,我们将通过几个具体的示例来分析和解决这个错误。

## 示例一

在我们的第一个示例中,我们定义了一个简单的RESTful服务,该服务会将一个JSON结构体映射到实体类中。以下是我们的代码:

```java
@RestController
public class UserController {

@PostMapping("/users")
public ResponseEntity<Void> createUser(@RequestBody UserDto userDto) {
// ...
return ResponseEntity.status(HttpStatus.OK).build();
}
}
```

我们的`UserDto`实体类定义如下:

```java
public class UserDto {

private String name;
private int age;

// getters and setters
}
```

现在,我们向这个服务发送如下请求:

```
POST http://localhost:8080/users
Content-Type: application/json

{
"name": "Tom",
"age": "20"
}
```

这时,我们会看到以下错误消息:

```
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `int` from String "20": not a valid `int` value; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `int` from String "20": not a valid `int` value
```

问题出在客户端向服务端发送的请求中,age字段被错误地定义为了String类型。

解决方法:将请求中的age字段的类型改为int即可。

## 示例二

在我们的第二个示例中,我们定义了一个使用Spring Data JPA框架的RESTful服务。我们将手动检查一个由客户端发送到服务器的HTTP请求中路由到的资源是否存在,如果不存在,我们将会返回一个错误状态码和错误消息。

以下是我们的代码:

```java
@RestController
public class UserController {

@Autowired
private UserRepository userRepository;

@GetMapping("/users/{id}")
public User getUserById(@PathVariable Long id) {
Optional<User> userOptional = userRepository.findById(id);
if (!userOptional.isPresent()) {
throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "User not found");
}
return userOptional.get();
}
}
```

在这个例子中,我们需要匹配URI中的{id}部分到数据库中的一个用户。如果该用户不存在,我们将返回一个错误状态码和错误消息,否则,我们将返回用户信息。

现在,我们向这个服务发送如下请求:

```
GET http://localhost:8080/users/1000
```

在这个请求中,我们明显看到了一个非法的用户ID。这时,我们会看到以下错误消息:

```
org.springframework.web.client.HttpClientErrorException: 404 Not Found
```

问题出在请求的URI中包含了一个不存在的ID,没有被正确地映射到实际的用户资源。

解决方法:处理请求前,我们需要先检查URI中的{id}部分,检查其对应的资源是否存在。如果资源不存在,我们应该返回一个错误状态码和错误消息。

## 总结

通过以上的两个示例,我们可以发现,在处理HTTP请求的过程中,一些常见的数据传输和逻辑错误会导致`org.springframework.http.converter.HttpMessageNotReadableException`的发生。为了避免这个问题,我们需要仔细检查请求的数据和URI匹配的资源是否合法。

对于这个错误,我们应该这样处理它:找出发生错误的数据或资源,分析原因,并修改请求数据或服务端代码,以防止这个错误的再次发生。

posted @ 2023-06-15 20:00  JackYang  阅读(1989)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3