Spring MVC: как перехватить 404 перед возвратом страницы ошибки / ответа? - PullRequest
1 голос
/ 22 января 2020

В моем веб-приложении Spring Boot 2.2.x мне нужно перехватить 404 ошибки, чтобы я мог выполнить некоторые пользовательские логи c до отображения страницы с ошибкой или до возврата json с информацией об ошибке.

Как правильно достичь этого?

В данный момент я пытаюсь использовать класс @ControllerAdvice, но я не знаю, какое исключение нужно обработать методом @ExceptionHandler (если выброшено какое-либо значение). ) ...

ПРИМЕЧАНИЕ : Я уже пытался перехватить NoHandlerFoundException, но, похоже, это не сработало ... (обработчик не сработал).

@ControllerAdvice
public class ErrorHandler {
    @ExceptionHandler(NoHandlerFoundException.class)
    public void handleException() {
        System.out.println("It's a 404!");
    }
}

Я также включил это в моем application.properties:

spring.mvc.throw-exception-if-no-handler-found=true

Любое другое предложение?

Ответы [ 3 ]

2 голосов
/ 22 января 2020

Я наконец нашел решение (или его часть) в этом вопросе: Пользовательский обработчик исключений для NoHandlerFoundException не работает без @ EnableWeb Mvc

По умолчанию Spring не работает скинуть исключение на 404 ошибки. Вам нужно включить это свойство в application.properties (или yaml):

spring.mvc.throw-exception-if-no-handler-found=true

Но вам также нужно установить это свойство:

spring.mvc.static-path-pattern: /static

Это ограничение не позволяет Spring искать данные о состоянии. c содержимое, соответствующее отсутствующему пути / обработчику.

Теперь вы можете перехватывать NoHandlerFoundException как обычно с помощью @ExceptionHandler.

ПРИМЕЧАНИЕ Перед установкой spring.mvc.static-path-pattern свойство, которое я пытался добавить @EnableWebMvc к классу конфигурации в моем проекте: таким образом, NoHandlerFoundException был брошен, но я, очевидно, потерял все автоконфигурации Spring Boot.

2 голосов
/ 22 января 2020

Используйте NoHandlerFoundException. Это соответствует 404 в весенней загрузке.

0 голосов
/ 22 января 2020

В том же классе вы используете @ControllerAdvice орудие ErrorController.

@ControllerAdvice
public class ControllerAdvice implements ErrorController {

    @RequestMapping("/error")
    public ResponseEntity<Map> handleError(HttpServletResponse response) {
        Map errorMapJson = new HashMap();

        if(response.getStatus() == HttpStatus.NOT_FOUND.value()) {
            errorMapJson.put("type", "404 Error");
        }

        return new ResponseEntity<Map>(errorMapJson, HttpStatus.NOT_FOUND);
    }

    @Override
    public String getErrorPath() {
        return "/error";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...