何时使用 ResponseStatusException 和 ControllerAdvice

问题描述

Spring5 引入了 ResponseStatusException,这让我陷入了两难境地,我在什么情况下可以使用 ResponseStatusException 和 ControllerAdvice,因为它们都很相似。

谁能帮我解决这个问题。 提前致谢。

解决方法

先来了解什么是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);
    }
}

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

@ControllerAdvice
public class RestResponseEntityExceptionHandler 
  extends ResponseEntityExceptionHandler {

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

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

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

参考文献:

  1. Spring ResponseStatusException

  2. Error Handling for REST with Spring

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...