Я пытаюсь показать пользовательские страницы ошибок в зависимости от кода состояния HTTP.Что я сделал, так это реализовал ErrorController
интерфейс Spring в CustomErrorController
, но кажется, что Spring Boot его не распознает.
Я следовал этому руководству, чтобы сделать это: https://www.baeldung.com/spring-boot-custom-error-page (раздел3.1).
Там я прочитал, что сначала нужно избавиться от знаменитой страницы Springlabel Error знаменитой Spring по умолчанию.Итак, я сделал это:
@SpringBootApplication(exclude = { ErrorMvcAutoConfiguration.class })
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
Кажется, это работает, так как страница ошибок Whitelabel больше не появляется, но теперь, когда происходит ошибка, появляется страница ошибок Apache Tomcat (эта уродливая с включенной трассировкой стека)вместо моего.
Тогда я только что реализовал свой CustomErrorController
следующим образом:
@Controller
@RequestMapping("/error")
public class CustomErrorController implements ErrorController {
@RequestMapping
public String handleError(HttpServletRequest request) {
Integer statusCode = (Integer) request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
if (statusCode != null) {
// Specific error page
return "redirect:/error/" + statusCode;
}
// Global error page
return "error/error";
}
@Override
public String getErrorPath() {
return "/error";
}
@GetMapping("/404")
public String notFoundErrorPage() {
return "error/404";
}
// Other error codes mapping methods
}
Я использую Thymeleaf, и мои сообщения об ошибках находятся под src/main/resources/views/error
, где каждый конкретныйимя страницы ошибки соответствует рекомендованному формату <error_code>.html
, поэтому, например, ошибка 404 будет связана со страницей 404.html
.
До сих пор у меня не было проблем с разрешением других представлений приложения.На самом деле я настроил Spring Security для вызова конечной точки /error/403
, если отказано в доступе и страница ошибки отображается правильно.
То же самое происходит с /error/500
, который вызывается, когда возникает внутреннее исключение сервера, так какЯ также реализовал следующий метод @ControllerAdvice @ExceptionHandler
:
@ControllerAdvice
@Log4j2
public class GlobalDefaultExceptionHandler {
@ExceptionHandler(Exception.class)
public String defaultErrorHandler(Exception exception) throws Exception {
if (AnnotationUtils.findAnnotation(exception.getClass(), ResponseStatus.class) != null) {
throw exception;
}
log.catching(exception);
return "redirect:/error/500";
}
}
Итак, если каждая из этих конечных точек работает индивидуально, почему, если Spring выдает ошибку, метод handleError
никогда не вызывается?
Спасибо.