1

我的基本需求是捕获用户定义的异常并返回通用响应。为此,我将@ControllerAdvice 与@ExceptionHandler 一起使用。请参阅下面的示例

@ControllerAdvice
public class CustomGlobalExceptionHandler extends ResponseEntityExceptionHandler  {

    @ExceptionHandler(PersonNotFoundException.class)
    public void handleBadPostalCode(HttpServletResponse response) throws IOException {
        response.sendError(HttpStatus.BAD_REQUEST.value(), "Invalid person Id");
    }

    @ExceptionHandler(Exception.class)
    public void handleDefault(Exception e, HttpServletResponse response) throws IOException {
        e.printStackTrace();
        response.sendError(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Unknown error happened");
    }
}

PersonNotFoundException 按预期处理。但是其他异常默认处理程序消失了,只返回没有正文的 Http 代码。显然,这是扩展 ResponseEntityExceptionHandler 时的预期行为。我可以覆盖其他默认异常,但这并不理想。使用通用的 Exception.class 处理程序将迫使我为所有这些返回一个 HTTP 代码。

所以我正在寻找一种方法来在 ControllerAdvice 或类似中全局处理我自己的异常,而不必覆盖默认异常处理程序

谢谢

4

1 回答 1

0

处理它的最快和最干净的方法就是@ResponseStatus在你的异常类上使用:

 @ResponseStatus(value=HttpStatus.NOT_FOUND, reason="No such Order")  // 404
 public class OrderNotFoundException extends RuntimeException {
     // ...
 }

还有ResponseEntityExceptionHandler必要延长吗?海事组织不是。您只能通过使用@ControllerAdvice(or @RestControllerAdvice) 和@ExceptionHandler

此外,您可以直接在方法中返回您的响应,而无需注入HttpServletResponse和调用send()方法。看看这个指南。

于 2019-09-19T18:16:46.920 回答