何时使用 ResponseStatusException 和 ControllerAdvice

Son*_*ali 5 error-handling exception response httpresponse controller-advice

Spring 5 引入了 ResponseStatusException,这让我陷入了困境,不知道在什么情况下可以使用 ResponseStatusException 和 ControllerAdvice,因为它们非常相似。

谁能帮我这个?

Anj*_*hna 7

我们先来了解一下什么是ResponseStatusException和ControllerAdvice

ResponseStatusException是 @ResponseStatus 的编程替代方案,并且是用于将状态代码应用于 HTTP 响应的异常的基类。

@GetMapping("/actor/{id}")
public String getActorName(@PathVariable("id") int id) {
    try {
        return actorService.getActor(id);
    } catch (ActorNotFoundException ex) {
        throw new ResponseStatusException(
          HttpStatus.NOT_FOUND, "Actor Not Found", ex);
    }
}
Run Code Online (Sandbox Code Playgroud)

@ControllerAdvice注释允许我们将多个分散的 @ExceptionHandler 合并到一个全局错误处理组件中。

@ControllerAdvice
public class RestResponseEntityExceptionHandler 
  extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value 
      = { IllegalArgumentException.class, IllegalStateException.class })
    protected ResponseEntity<Object> handleConflict(
      RuntimeException ex, WebRequest request) {
        return ResponseEntity<Object>;
    }
}
Run Code Online (Sandbox Code Playgroud)

回到你何时使用什么的问题:

  1. 如果您想提供统一且全局的异常处理方式,请使用 ControllerAdvice。它还消除了可能由 ResponseStatusException 引起的代码重复。
  2. 为了对同一异常抛出不同的错误代码和响应,不想创建自定义异常类并避免紧密耦合,请使用 ResponseStatusException。

参考:

  1. Spring 响应状态异常

  2. 使用 Spring 进行 REST 的错误处理