【发布时间】:2021-10-12 12:07:11
【问题描述】:
所以我正在尝试学习 Spring Boot 和 Rest API 的各种资源,我在几个不同的教程和教科书中遇到了同样的问题。它似乎源于 CrudRepository 接口,更具体地说是 JpaRepository.findById() 方法。
我读过的每个教程都有以下内容:
@GetMapping("/{id}")
public ResponseEntity<UserDTO> getUserById(@PathVariable("id") final Long id){
UserDTO user = userJpaRepository.findById(id);
if (user == null) {
return new ResponseEntity<UserDTO>(
new CustomErrorType("User with id " + id + " not found"),
HttpStatus.NOT_FOUND);
}
return new ResponseEntity<UserDTO>(user, HttpStatus.OK);
但是, UserDTO user = userJpaRepository.findById(id); 不会编译。
我想如果我将其更改为UserDTO user = userJpaRepository.findById(id).get();,它会编译、运行并且 GET 成功。问题是如果在 GET 请求中找不到用户 ID,它不会返回 NULL,并且我会收到 500 内部服务器错误。
来自我的 IDE 的工具提示和建议将代码更正为
@GetMapping("/{id}")
public ResponseEntity<UserDTO> getUserById(@PathVariable("id") final Long id){
Optional<UserDTO> user = userJpaRepository.findById(id);
if (user == null) {
return new ResponseEntity<UserDTO>(
new CustomErrorType("User with id " + id + " not found"),
HttpStatus.NOT_FOUND);
}
return new ResponseEntity<UserDTO>(HttpStatus.OK);
}
这与 GET 请求和错误处理一样有效。为什么所有教程都以第一种方式列出? 有人可以向我解释这里发生了什么吗?
【问题讨论】:
-
您需要确定您的数据库中存在一些值为
id的记录,也许这就是教程这样做的原因。拥有Optional通用 imo 更安全,编写 if 条件并记录null比在生产中找到它要容易得多。 -
见stackoverflow.com/a/49317013/2612030。显然 API 已更改。
-
@MauricioGraciaGutierrez 至于为什么它的呈现方式不同,是的。至于实际发生了什么以及我如何让它发挥作用,不。我试图弄清楚不同的 HTTP 请求以及它们如何对应 CRUD 接口。只要字段有效,HTTP 方法就可以正常工作。我已经设法让
GET请求工作并以一种可以接受的方式处理错误。但是,POSTPUT或DELETEhttp 方法的错误处理都没有按照我所关注的本书所表明的方式进行。
标签: java spring-boot rest