На основе ссылки MDN (около дна) Safari еще не поддерживает эту функцию.
@ExceptionHandler
-аннотированные методы вызываются, когда метод @RequestMapping
того же класса выбрасывает исключение. Поэтому, когда вы добавили отображение, которое вызвало NullPointerException
, это сработало, поскольку отображенный метод и обработчик исключения находились в одном классе.
Когда отображение не найдено, Spring не имеет возможности связать NoSuchRequestHandlingMethodException
с вашим @ExceptionHandler
, поскольку он не дошел до сопоставления запроса с методом обработчика. Это не упоминается в документации в явном виде, но я наблюдал именно такое поведение.
Если вы хотите специально обработать это исключение, вам придется использовать более общий подход HandlerExceptionResolver
, а не более специализированный @ExceptionHandler
.
В Spring 3.2 вы можете использовать @ContollerAdvice , чтобы иметь ExceptionHandler для всех ваших контроллеров, например:
@ControllerAdvice
public class GeneralHandler {
@ExceptionHandler
public ModelAndView handleException (NoSuchRequestHandlingMethodException ex) {
ModelAndView mav = new ModelAndView();
...
return mav;
}
}
Вы можете даже добавить больше аннотаций для возврата сериализованного json
@ExceptionHandler
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
public RestError resolveBindingException ( MethodArgumentNotValidException methodArgumentNotValidException, Locale locale )
{
BindingResult bindingResult = methodArgumentNotValidException.getBindingResult();
return getRestError(bindingResult, locale);
}