为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕尼黑8549860 2022-05-25 10:58:21
我使用 Spring Boot 开发了一个 rest api。在我的一种服务方法中,我抛出一个ServletException,以防找不到特定用户。我想知道这是否是最好的方法,我的意思是,这是抛出异常的正确层吗?
查看完整描述

3 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

创建自定义异常类型比使用ServletException. 为了处理异常,您可以使用@ControllerAdvice. 首先创建自定义异常类型:


public class UserNotFoundException extends RuntimeException {


  public UserNotFoundException(String message) {

    super(message);

  }

}

假设您的控制器和服务看起来或多或少是这样的:


@RestController

@RequestMapping("users")

class UserController {


  private final UserService userService;


  UserController(UserService userService) {

    this.userService = userService;

  }


  @GetMapping

  List<String> users() {

    return userService.getUsers();

  }

}


@Service

class UserService {


  List<String> getUsers() {

    // ...

    throw new UserNotFoundException("User not found");

  }

}

你可以处理你UserNotFoundException使用@ControllerAdvice


@ControllerAdvice

class CustomExceptionHandler {


  @ExceptionHandler({UserNotFoundException.class})

  public ResponseEntity<Object> handleUserNotFoundException(UserNotFoundException exception) {

    return new ResponseEntity<>(exception.getMessage(), HttpStatus.NOT_FOUND);

  }

}


查看完整回答
反对 回复 2022-05-25
?
墨色风雨

TA贡献1853条经验 获得超6个赞

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

1.)区域

2.) Spring Boot 教程


查看完整回答
反对 回复 2022-05-25
?
慕标5832272

TA贡献1966条经验 获得超4个赞

在你的抛出异常@Service是可以的。ServletException不是很有意义。我的建议是创建自己的 Exception 类扩展RuntimeException并抛出它。


所以你最终会得到类似的东西:


一个只调用服务方法的Controller(这里最好不要有任何逻辑)


@RestController

@RequestMapping("/users")

public class UserController {


    @Autowired

    private UserService userService;


    @GetMapping("/{id}")

    public User getUserById(@PathVariable("id") Long id) {

        return userService.getById(id);

    }

}

一个Service调用DAO类的类(扩展JPARepository)


@Service

public class UserServiceImpl implements UserService {


    @Autowired

    private UserDAO userDAO;


    @Override

    public User getById(Long id) {

        return userDAO.findById(id).orElseThrow(() -> new UserNotFoundException("No user with id = " + id + " found."));

    }

}

道:


@Repository

public interface UserDAO extends JpaRepository<User, Long> {

}

注意:它返回Optional<Object>非常方便。


最后是你自己的Exception课。


@ResponseStatus(HttpStatus.NOT_FOUND)

public class UserNotFoundException extends RuntimeException {

    public UserNotFoundException(String message) {

        super(message);

    }

}

注意:@ResponseStatus- 它会在抛出此异常时返回 HTTP 状态代码 404。


恕我直言,这是开发您的 rest api 的一种非常干净和好的方法。


还可以在这里查看:How to get spesific error instead of Internal Service Error。我回答了一个问题,提供了您可能会觉得有用的信息


查看完整回答
反对 回复 2022-05-25
  • 3 回答
  • 0 关注
  • 123 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信