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