Spring-boot Rest:使用ControllerAdvice,但保留默认处理程序

时间:2019-09-19 14:40:51

标签: spring rest spring-boot controller-advice

我的基本需求是捕获用户定义的异常并返回通用响应。为此,我将@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或类似程序中全局处理我自己的异常,而不必重写默认异常处理程序

谢谢

1 个答案:

答案 0 :(得分:0)

处理它的最快,最清洁的方法就是对异常类使用@ResponseStatus

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

还要扩展ResponseEntityExceptionHandler吗?海事组织不是。您只能使用@ControllerAdvice(或@RestControllerAdvice)和@ExceptionHandler

处理它

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