Ответ 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
}
}