猿问

在 Spring Boot 应用程序中处理或抛出异常的最佳实践是什么?

我使用 Spring Boot 开发了一个 rest api。在我的一种服务方法中,我抛出一个ServletException,以防找不到特定用户。我想知道这是否是最好的方法,我的意思是,这是抛出异常的正确层吗?



慕尼黑8549860
浏览 124回答 3
3回答

慕森王

创建自定义异常类型比使用ServletException. 为了处理异常,您可以使用@ControllerAdvice. 首先创建自定义异常类型:public class UserNotFoundException extends RuntimeException {&nbsp; public UserNotFoundException(String message) {&nbsp; &nbsp; super(message);&nbsp; }}假设您的控制器和服务看起来或多或少是这样的:@RestController@RequestMapping("users")class UserController {&nbsp; private final UserService userService;&nbsp; UserController(UserService userService) {&nbsp; &nbsp; this.userService = userService;&nbsp; }&nbsp; @GetMapping&nbsp; List<String> users() {&nbsp; &nbsp; return userService.getUsers();&nbsp; }}@Serviceclass UserService {&nbsp; List<String> getUsers() {&nbsp; &nbsp; // ...&nbsp; &nbsp; throw new UserNotFoundException("User not found");&nbsp; }}你可以处理你UserNotFoundException使用@ControllerAdvice@ControllerAdviceclass CustomExceptionHandler {&nbsp; @ExceptionHandler({UserNotFoundException.class})&nbsp; public ResponseEntity<Object> handleUserNotFoundException(UserNotFoundException exception) {&nbsp; &nbsp; return new ResponseEntity<>(exception.getMessage(), HttpStatus.NOT_FOUND);&nbsp; }}

墨色风雨

我假设您希望捕获应用程序中发生的所有异常。Spring-Boot 提供了一个全局异常处理程序来优雅地捕获所有异常并根据特定的异常返回响应。它使您可以灵活地相应地更改状态代码、响应数据和标头。实现此功能的几个有用链接是 -1.)区域2.)&nbsp;Spring Boot 教程

慕标5832272

在你的抛出异常@Service是可以的。ServletException不是很有意义。我的建议是创建自己的 Exception 类扩展RuntimeException并抛出它。所以你最终会得到类似的东西:一个只调用服务方法的Controller(这里最好不要有任何逻辑)@RestController@RequestMapping("/users")public class UserController {&nbsp; &nbsp; @Autowired&nbsp; &nbsp; private UserService userService;&nbsp; &nbsp; @GetMapping("/{id}")&nbsp; &nbsp; public User getUserById(@PathVariable("id") Long id) {&nbsp; &nbsp; &nbsp; &nbsp; return userService.getById(id);&nbsp; &nbsp; }}一个Service调用DAO类的类(扩展JPARepository)@Servicepublic class UserServiceImpl implements UserService {&nbsp; &nbsp; @Autowired&nbsp; &nbsp; private UserDAO userDAO;&nbsp; &nbsp; @Override&nbsp; &nbsp; public User getById(Long id) {&nbsp; &nbsp; &nbsp; &nbsp; return userDAO.findById(id).orElseThrow(() -> new UserNotFoundException("No user with id = " + id + " found."));&nbsp; &nbsp; }}道:@Repositorypublic interface UserDAO extends JpaRepository<User, Long> {}注意:它返回Optional<Object>非常方便。最后是你自己的Exception课。@ResponseStatus(HttpStatus.NOT_FOUND)public class UserNotFoundException extends RuntimeException {&nbsp; &nbsp; public UserNotFoundException(String message) {&nbsp; &nbsp; &nbsp; &nbsp; super(message);&nbsp; &nbsp; }}注意:@ResponseStatus- 它会在抛出此异常时返回 HTTP 状态代码 404。恕我直言,这是开发您的 rest api 的一种非常干净和好的方法。还可以在这里查看:How to get spesific error instead of Internal Service Error。我回答了一个问题,提供了您可能会觉得有用的信息
随时随地看视频慕课网APP

相关分类

Java
我要回答