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

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

HTTP-статус 404 -

Тип Статус отчета

сообщение

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

Apache Tomcat / 7.0.37

Я только что получил это, когда включить отладку в консоли:

ПРЕДУПРЕЖДЕНИЕ: org.springframework.web.servlet.PageNotFound - сопоставление для HTTP-запроса с URI не найдено

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

есть идеи как с этим справиться?

2 ответа

Решение

Причина прямо здесь, в 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
    }
}

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

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

Другие вопросы по тегам