Обработка исключений Spring MVC с HandlerExceptionResolver - PullRequest
5 голосов
/ 29 августа 2011

В настоящее время я пытаюсь использовать HandlerExceptionResolver для обработки исключений в проекте Spring MVC.

Я хочу обрабатывать обычные исключения через resolveException, а также через 404 handleNoSuchRequestHandlingMethod.

В зависимости от типа запроса JSON или text / html ответ об исключении должен быть возвращен соответствующим образом.

resolveException работает сейчас.

Но handleNoSuchRequestHandlingMethod вызывает у меня головную боль. Это никогда не называется!

Согласно документу метод должен вызываться при 404 ошибках

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolver.html

Что я делаю не так ...

Это то, что я имею до сих пор.

public class JsonExceptionResolver implements HandlerExceptionResolver {

  protected final Log logger = LogFactory.getLog(getClass());

  public ModelAndView resolveException(HttpServletRequest request,
    if (exception instanceof NoSuchRequestHandlingMethodException) {
              return handleNoSuchRequestHandlingMethod((NoSuchRequestHandlingMethodException)             exception, request, response, handler);
    }
    ...                
  }

  public ModelAndView handleNoSuchRequestHandlingMethod(NoSuchRequestHandlingMethodException ex,
      HttpServletRequest request,
      HttpServletResponse response,
      Object handler){

    logger.info("Handle my exception!!!");

    ModelAndView mav = new ModelAndView();
    boolean isJSON = request.getHeader("Accept").equals("application/json");

    if(isJSON){
    ...

    }else{
    ..
    }

    return mav;
  }

}

РЕДАКТИРОВАТЬ с DefaultHandlerExceptionResolver :

public class MyExceptionResolver extends  DefaultHandlerExceptionResolver {

  protected final Log logger = LogFactory.getLog(getClass());

  @Override
  protected ModelAndView doResolveException(HttpServletRequest request,  HttpServletResponse response, Object handler, Exception exception) {
    logger.warn("An Exception has occured in the application", exception);


    logger.info("exception thrown " + exception.getMessage() );
    if (exception instanceof NoSuchRequestHandlingMethodException) {
      return handleNoSuchRequestHandlingMethod((NoSuchRequestHandlingMethodException) exception, request, response, handler);
    }

    ...
    return mav;
  }

  public ModelAndView handleNoSuchRequestHandlingMethod(NoSuchRequestHandlingMethodException ex,
      HttpServletRequest request,
      HttpServletResponse response,
      Object handler){

    logger.info("Handle my exception!!!");

    ModelAndView mav = new ModelAndView();
    boolean isJSON = request.getHeader("Accept").equals("application/json");

    if(isJSON){

      ...
    }else{
      ...
    }

    return mav;
  }  
}

Приведенный выше код по-прежнему не действует.

Есть еще идеи?

Ответы [ 2 ]

3 голосов
/ 09 ноября 2011

По словам Юргена Хеллера из Spring, это невозможно с HandlerExceptionResolver, потому что он работает только для суб-отображения, например,

, у вас есть контроллер, сопоставленный с /account/** и доступ к методу из учетной записигде нет сопоставления, такого как /acount/notExists, чем оно должно работать.

Я открою билет JIRA улучшение для этой функции

РЕДАКТИРОВАТЬ:

Билет JIRA по этому вопросу

https://jira.springsource.org/browse/SPR-8837?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=72648#comment-72648

2 голосов
/ 29 августа 2011

handleNoSuchRequestHandlingMethod не является частью интерфейса HandlerExceptionResolver, поэтому простое объявление метода с таким именем ничего не изменит. Это защищенный метод, специфичный для DefaultHandlerExceptionResolver, и вызывается из его resolveException метода (который является частью интерфейса):

if (ex instanceof NoSuchRequestHandlingMethodException) {
   return handleNoSuchRequestHandlingMethod((NoSuchRequestHandlingMethodException) ex, request, response, handler);
}

Для воспроизведения той же функциональности вы можете либо создать подкласс DefaultHandlerExceptionResolver и переопределить необходимые методы, либо добавить в ваш метод resolveException случай, который обрабатывает NoSuchRequestHandlingMethodException.

.
...