Другой подход (то, что я использую) - создать глобальный обработчик исключений и сообщить Spring, что он должен использоваться. Тогда вам не нужно дублировать свою логику или расширять тот же базовый контроллер, что и вам, когда вы должны аннотировать метод контроллера с помощью @ExceptionHandler
. Вот простой пример.
public class ExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse response, Object o, Exception e) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); // Or some other error code
ModelAndView mav = new ModelAndView(new MappingJackson2JsonView());
mav.addObject("error", "Something went wrong: \"" + e.getMessage() + "\"");
return mav;
}
}
И в <something>-servlet.xml
назначении его в качестве разыскиваемого exceptionResolver:
<!-- Define our exceptionHandler as the resolver for our program -->
<bean id="exceptionResolver" class="tld.something.ExceptionHandler" />
Тогда все исключения будут отправлены на ваш ExceptionHandler, и там вы можете посмотреть на запрос и определить, как вы должен отвечать пользователю. В моем случае я использую Джексона.
Просмотрите аннотацию ['@ ExceptionHandler'] (http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/bind/annotation/ExceptionHandler.html) , –