Spring Boot не показывает страницы ошибок, реализующие пользовательский ErrorController - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь показать пользовательские страницы ошибок в зависимости от кода состояния 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 никогда не вызывается?

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...