Подтвердить что ты не робот

Spring MVC Spring Безопасность и обработка ошибок

Я использую ResponseEntityExceptionHandler для глобальной обработки ошибки и почти нормальной работы, за исключением того, что я хочу обрабатывать неправильный запрос с помощью spring. Любая логическая переопределяющая handleNoSuchRequestHandlingMethod должна справиться с этим, но инсталлированная обработка всегда получает

Состояние HTTP 404 -

введите Отчет о состоянии

сообщение

описание Запрошенный ресурс не имеется.

Apache Tomcat/7.0.37

Я просто получил это, когда разрешил отладку в консоли:

WARN: org.springframework.web.servlet.PageNotFound - Не найдено сопоставления для HTTP-запроса с URI

просто для уточнения с помощью обработки я имею в виду, что я возвращаю JSON.

любая идея, как справиться с этим?

4b9b3361

Ответ 1

Причина прямо там в классе DispatcherServlet; он отправляет ответ об ошибке, не беспокоясь о вызове обработчика исключений (по умолчанию).

Начиная с версии 4.0.0.RELEASE это поведение можно просто изменить с помощью параметра throwExceptionIfNoHandlerFound:

Установите, следует ли выкидывать исключение NoHandlerFoundException, если обработчик не найден для этого запроса. Это исключение можно поймать с помощью метода контроллера HandlerExceptionResolver или @ExceptionHandler.

Конфигурация XML:

<servlet>
    <servlet-name>rest-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>throwExceptionIfNoHandlerFound</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>

Конфигурация на основе Java:

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    void customizeRegistration(ServletRegistration.Dynamic registration) {
        registration.setInitParameter("throwExceptionIfNoHandlerFound", "true");
    }
    ...
}

Тогда NoHandlerFoundException можно обрабатывать следующим образом:

@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @Override
    ResponseEntity handleNoHandlerFoundException(NoHandlerFoundException ex,
            HttpHeaders headers, HttpStatus status, WebRequest request) {
        // return whatever you want
    }
}

Ответ 2

throwExceptionIfNoHandlerFound учитывайте, только если обработчиков для найденного запроса.

В случае настройки default-servlet-handler DefaultServletHttpRequestHandler будет обрабатывать запрос. Итак, если это решение не работает, удалите его и посмотрите (отлаживайте) это место DispatcherServlet.