Проблемы реализации обработчика исключений контроллера Spring 3 - PullRequest
7 голосов
/ 14 апреля 2010

Я надеялся реализовать один «ExceptionController» для обработки исключений, которые вызываются при выполнении методов других моих контроллеров. Я не указал никакой HandlerExceptionResolver в контексте моего приложения, поэтому в соответствии с документацией API должен быть запущен AnnotationMethodHandlerExceptionResolver. Я подтвердил это как таковой в источнике. Так почему же не работает следующее?

@Controller
public class ExceptionController {

  @ExceptionHandler(NullPointerException.class)
  public ModelAndView handleNullPointerException(NullPointerException ex) {
    // Do some stuff
    log.error(logging stuff)
    return myModelAndView;
  }
}

@Controller
public class AnotherController {

  @RequestMapping(value="/nullpointerpath")
  public String throwNullPointer() {
    throw new NullPointerException();
  }
}

Я вижу в журналах отладки, что три обработчика исключений по умолчанию запрашиваются для обработки исключения, но ничего не делается, и я вижу "DispatcherServlet - Не удалось завершить запрос". За ним следует отображение трассировки стека и внутренней ошибки 500.

Ответы [ 3 ]

5 голосов
/ 14 апреля 2010

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

4 голосов
/ 29 декабря 2010

Вы должны записать свой обработчик исключений в тот же класс, с которым вы хотите работать, как показано ниже.

@Controller
public class AnotherController {
    @ExceptionHandler(NullPointerException.class)
    public ModelAndView handleNullPointerException(NullPointerException ex) {
        // Do some stuff.
        log.error(logging stuff)
        return myModelAndView;
    }

    @RequestMapping(value="/nullpointerpath")
    public String throwNullPointer() {
        throw new NullPointerException();
    }
}
1 голос
/ 14 апреля 2010

Не думаю, что это хороший дизайн. Контроллеры в Spring обрабатывают HTTP-запросы и сопоставляют с URL-адресами. Я не думаю, что «исключение» вписывается ни в одну корзину. Для меня это похоже на злоупотребление весной.

Исключением не является HTTP-запрос. Вы не сопоставляете исключение с URL. Поэтому я бы пришел к выводу, что контроллеры не предназначены для обработки в качестве обработчиков исключений.

Контроллеры являются частью Spring API, но ваш дизайн не использует их по назначению, поэтому он не работает. Переосмыслите свой дизайн.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...