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
,