Spring MVC @ExceptionHandler метод в контроллере никогда не вызывается - PullRequest
14 голосов
/ 28 марта 2012

У меня есть контроллер Spring MVC с несколькими простыми запросами на обслуживание REST. Я хотел бы добавить некоторую обработку ошибок, когда из моих служб вызываются определенные исключения, но я не могу заставить метод обработчика, аннотированный @ExceptionHandler, фактически вызываться. Вот одна служба, которую я намеренно выбрасываю, чтобы попытаться заставить мой метод обработчика вступить во владение. Метод-обработчик никогда не вызывается, и Spring просто возвращает ошибку 500 вызывающему клиенту. У вас есть идеи, что я делаю не так?

@ExceptionHandler(IOException.class)
public ModelAndView handleIOException(IOException ex, HttpServletRequest request, HttpServletResponse response) {
    response.sendError(HttpServletResponse.SC_FORBIDDEN);
    System.out.println("It worked!");
    return new ModelAndView();
}

@RequestMapping(value = "/json/remove-service/{id}", method = RequestMethod.DELETE)
public void remove(@PathVariable("id") Long id) throws IOException {
    throw new IOException("The handler should take over from here!");
}

Ответы [ 4 ]

13 голосов
/ 28 марта 2012

Этот совет на весеннем форуме может вам помочь.

Вероятно, вы настроили bean-компоненты для вашего DispatchServlet в файле webmvc-servlet.xml (файл * -servlet.xml может называться по-другому)

Если файл XML уже включает в себя еще один ExceptionResolver (например, SimpleMappingExceptionResovler Spring не будет автоматически добавлять какие-либо другие средства распознавания для вас. Поэтому добавьте преобразователь аннотаций вручную следующим образом:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver" />

Должен включить обработку @HandlerException.

12 голосов
/ 08 февраля 2013

К сожалению, я тоже страдал от этого.Я обнаружил, что если вы по ошибке реализуете Throwable вместо Exception, распознаватель исключений просто сбросит ваш Throwable как IllegalStateException.Это не сможет вызвать ваш @ExceptionHandler.

Если вы внедрили Throwable вместо Exception, попробуйте изменить его на Exception.

Вот код, о котором идет речь, InvocableHandlerMethod

catch (InvocationTargetException e) {
            // Unwrap for HandlerExceptionResolvers ...
            Throwable targetException = e.getTargetException();
            if (targetException instanceof RuntimeException) {
                throw (RuntimeException) targetException;
            }
            else if (targetException instanceof Error) {
                throw (Error) targetException;
            }
            else if (targetException instanceof Exception) {
                throw (Exception) targetException;
            }
            else {
                String msg = getInvocationErrorMessage("Failed to invoke controller method", args);
                throw new IllegalStateException(msg, targetException);
            }
        }
4 голосов
/ 23 июля 2013

Я обнаружил, что @ExceptionHandler работает с Throwable, когда вы определяете метод таким образом:

@ExceptionHandler(Throwable.class)
@ResponseBody
public String handleException(Throwable e) {

}

В этом случае метод имеет только один аргумент типа Throwable. Если я пытаюсь использовать в этом методе некоторые дополнительные параметры (я пытался использовать модель), я получаю 500 исключений (этот метод не вызывается). Однако это все еще работает, когда дополнительными параметрами являются HttpServlerRequest или HttpServlerResponse.

0 голосов
/ 28 марта 2012

Это не будет работать, потому что когда вы возвращаете String, вы возвращаете View name.

Теперь ваш контроллер Spring MVC ищет этот метод никогда не вызывается!Почему бы и нет?!посмотреть и найти можно.

Убедитесь, что @ExceptionHandler сопоставлено с существующим видом.

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