2010-05-20 2 views
8

У меня есть метод в моем контроллере, который будет обрабатывать исключения, брошенные приложением. Поэтому у меня есть метод, подобный этому.@ExceptionHandler не обрабатывает заброшенные исключения

@Controller 
public class ExceptionController { 

    @RequestMapping(value="/error") 
    @ExceptionHandler(value={Exception.class, NullPointerException.class}) 
    public String showError(Exception e, Model model){ 
     return "tiles:error"; 
    } 
} 

И попробовать я, если это работает я бросаю NullPointerException в другом методе в другом контроллере метод:

boolean a = true; 
if(a){ 
    throw new NullPointerException(); 
} 

После исключения выброшен он печатается в JSP, но это не делает go бросить мой метод showError() (я установил точку останова там, и он никогда не входит). Метод showError() поймает исключение и отобразит разные страницы ошибок в зависимости от типа исключения (хотя теперь он всегда показывает ту же страницу ошибок). Если я перейду к url ​​/ error, он отобразит страницу с ошибкой, чтобы метод showError() был в порядке.

Я использую Spring 3.

Что может быть проблема?

Спасибо.

+2

Если вы хотите отделить обработку исключений от контроллеров, вместо этого используйте 'HandlerExceptionResolver': http://static.springsource.org/spring/docs/3.0. x/spring-framework-reference/html/mvc.html # d0e29470 – skaffman

ответ

7

Если вы посмотрите на ваши журналы, вы, вероятно, увидите:

java.lang.IllegalStateException: неподдерживаемых аргумент [org.springframework.ui.Model] для @ExceptionHandler метода

Другими словами, @ExceptionHandler методы не разрешено объявлять параметр Model (см. docs).

Удалите этот параметр (который вы все равно не используете), и он должен работать должным образом.

+0

Спасибо, правда, но это не решает проблему. Я понял, что исключение попадает только тогда, когда оно выбрано методом, находящимся внутри одного и того же контроллера. Возможно, из-за этой ошибки: https://jira.springsource.org/browse/SPR-5959 – Javi

+1

@Javi: Это не ошибка, это по дизайну и указано в документах: http: //static.springsource. org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html # mvc-ann-exceptionhandler – skaffman

+0

Я посмотрел на страницу документа u, связанную с выше, но я должен быть плотным, я не вижу все, что говорит о том, что вы не можете включить параметр модели в метод, можете ли вы указать на это? – chrismarx

0

Если вы хотите обрабатывать исключения в глобальном масштабе (вне вашего контроллера), вы можете использовать аннотированный класс @ControllerAdvice, в который вы помещаете аннотированные методы @ExceptionHandler.

см. http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc для примера. И http://blog.codeleak.pl/2013/11/controlleradvice-improvements-in-spring.html для улучшений, сделанных весной 4.

Смежные вопросы