gpt4 book ai didi

java - JPA EmptyResultDataAccessException 处理

转载 作者:搜寻专家 更新时间:2023-11-01 03:33:40 25 4
gpt4 key购买 nike

我正在为一个大学项目编写一个简单的库 API。我有一个包含书籍的数据库,每本书都有自己的 ID。我正在使用 Spring Boot 来提供服务。我有一个 BookRepository延伸JpaRepository<Book, Long>和服务实现。

@Service
public class BookServiceImpl implements BookService{

@Autowired
private BookRepository bookRepository;

@Async
@Override
public void delete (Long id){
bookRepository.delete(id);
}
}

稍后,REST Controller 处理请求:

@RestController
public class BookServiceController{

@Autowired
private BookService bookService;

@RequestMapping(value="books/{id}", method = RequestMethod.DELETE)
public ResponseEntity<Book> deleteBook (@PathVariable("id") Long id){
bookService.delete(id);
return new ResponseEntity<Book>(HttpStatus.OK);
}
}

现在,如果我要删除一本不在数据库中的书,例如 ID 为 123 的书,我会抛出 EmptyResultDataAccessException。

我的问题是,如何以及在何处处理异常,以及如何避免以这种方式强制转换 NullPointerException?

提前致谢。

最佳答案

DELETE 操作的情况下,您实际上不再返回实体;您只是在确认资源已经消失。由于 DELETE 是幂等的(您可以多次删除该记录),您可以返回相同的状态代码而不管该记录是否存在,或者如果找不到该记录则返回 404。您还可以简化处理程序方法:

@DeleteMapping("/books/{id}")
@ResponseStatus(HttpStatus.NO_CONTENT) // because you deleted it
public void deleteBook(@PathVariable Long id) {
try {
bookService.delete(id); // or just use the repository directly
} catch (EmptyResultDataAccessException ex) {
// either do nothing to return a 204, or
throw new NotFoundException();
}
}

你有一个指示状态的异常:

@ResponseStatus(HttpStatus.NOT_FOUND)
public class NotFoundException extends RuntimeException {}

很有可能 EmptyResultDataAccessException 应该已经被注释为 NOT_FOUND 状态;这是一个潜在的增强请求。

关于java - JPA EmptyResultDataAccessException 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39233648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com