你可能想看看ExceptionHandler
。
它非常好用且灵活,允许您实现逻辑以显示不同的错误页面并根据异常输出不同的 HTTP 响应代码(这并不总是必需的,但很高兴知道您可以轻松地做到这一点)。
我在此处粘贴我的代码,因为我认为它对于解决有关此主题的常见问题很有用。
@ExceptionHandler(Exception.class)
public ModelAndView resolveException(Exception ex,
HttpServletRequest request,
HttpServletResponse response) {
// I get an email if something goes wrong so that I can react.
if (enableEmailErrorReporting)
sendExceptionEmail(request.getRequestURL().toString(), ex);
ModelAndView mav = getModelAndView(ex, request);
setStatusCode(ex, response);
return mav;
}
protected ModelAndView getModelAndView(Exception ex,
HttpServletRequest request) {
// Here you can implement custom logic to retrieve the correct
// error page depending on the exception. You should extract
// error page paths as properties or costants.
return new ModelAndView("/WEB-INF/app/error.html");
}
// This is really nice.
// Exceptions can have status codes with the [`ResponseStatus`][2] annotation.
private void setStatusCode(Exception ex, HttpServletResponse response) {
HttpStatus statusCode = HttpStatus.BAD_REQUEST;
ResponseStatus responseStatus =
AnnotationUtils.findAnnotation(ex.getClass(),
ResponseStatus.class);
if (responseStatus != null)
statusCode = responseStatus.value();
response.setStatus(statusCode.value());
}
这里的逻辑是控制器方法抛出未捕获的异常。Spring 将调用标记为的方法ExceptionHandler
(您可以为每个控制器、每个异常或全局默认设置一个,通常我让我的所有控制器都从BaseController
我定义此方法的类继承)。传递给该方法的是异常本身以及选择要显示的正确视图所需的任何其他信息。更重要的是,您可以查看是否在异常上声明了特定的 HTTP 响应代码(例如,500 表示未经检查的异常,400 表示验证错误,等等),并将该代码与您的错误页面一起返回。