Я намерен определить одну глобальную настраиваемую страницу 404 для всех моих контроллеров и одну глобальную страницу 500 для всех исключений. Я прочитал здесь кучу вопросов + все статьи со страницы первых результатов Google.
У меня есть WebInitializer:
public class MyWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) throws ServletException {
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
rootContext.register(WebAppConfiguration.class);
AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();
DispatcherServlet servlet = new DispatcherServlet(dispatcherContext);
servlet.setThrowExceptionIfNoHandlerFound(true);
ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", servlet);
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
И теперь у меня есть следующий обработчик исключений:
@ControllerAdvice
public class CustomGlogalExceptionHandler {
public static final String DEFAULT_ERROR_VIEW = "/error/500";
@ExceptionHandler(value = Exception.class)
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null)
throw e;
ModelAndView mav = new ModelAndView();
mav.addObject("url", req.getRequestURL());
mav.setViewName(DEFAULT_ERROR_VIEW);
return mav;
}
@ExceptionHandler(value = NoHandlerFoundException.class)
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public ModelAndView noPageFoundHandler(HttpServletRequest req, Exception e) throws Exception {
ModelAndView mav = new ModelAndView();
mav.addObject("url", req.getRequestURL());
mav.setViewName("/error/404");
return mav;
}
}
Он отлично работает при нажатии http://localhost:8080/test
: я получаю свою пользовательскую страницу 404 + код ответа 404. Он также отлично работает, если я куда-то кидаю искусственно: он показывает мою пользовательскую страницу 500 + код ответа 500.
Но если произойдет какое-то реальное исключение, я не получу ни кода ответа 500, ни своей пользовательской страницы 500. Например, теперь у меня есть org.hibernate.LazyInitializationException
, но то, что я вижу в консоли Chrome, - это всего лишь код ответа 200, хотя я вижу полную трассировку стека в консоли сервера, и исключение - последнее, которое он показывает. Кроме того, если шаблонизатор Thymeleaf выдает ошибку, он показывает полную трассировку стека в браузере. Что еще мне нужно настроить, чтобы он работал правильно? Спасибо.