Spring MVC, миграция @ExceptionHandler в HandlerExceptionResolver для службы RESTful

Фон

У меня есть класс сообщений об ошибках:

@XmlRootElement
public class ErrorMessage {
    private String message;

    public ErrorMessage() {
    }

    public ErrorMessage(String message) {
        this.message = message;
    }

    public String getError() {
        return message;
    }

    public void setError(String message) {
        this.message = message;
    }
}


Этот класс был назначен в качестве возвращаемого значения для @ExceptionHandler в моем Spring MVC Контроллер REST:

@ExceptionHandler
@ResponseStatus(HttpStatus.NOT_FOUND)
@ResponseBody
ErrorMessage handleException(RuntimeException e) {
    return new ErrorMessage("something went wrong");
}

Всякий раз, когда клиент запускает RuntimeExceptionпосле отправки запроса с application/jsonв качестве заголовка Accept, он получает ответ с правильным код состояния и соответствующее тело JSON:

{"error":"something went wrong"}

Альтернативно, тело XML получено, если заголовок Acceptимеет вид application/xml:


something went wrong


Проблема

Теперь я бы мне нравится генерировать это решение, реализуя вместо этого HandlerExceptionResolver, поэтому мне не нужно копировать/вставлять @ExceptionHandlerв каждый контроллер (или создавать общий «родительский контроллер», который другой контроллеры могут расширяться).

Однако метод AbstractHandlerExceptionResolver.doResolveException()возвращает ModelAndView, а не мое собственное ErrorMessage, поэтому я пробовал следующее:

public class RuntimeExceptionHandlerExceptionResolver extends AbstractHandlerExceptionResolver {

    @Override
    protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        if (ex instanceof RuntimeException) {
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            ModelAndView mav = new ModelAndView();
            mav.addObject("error", "something went wrong");
            return mav;
        }
        return null;
    }
}

При отладке , я вижу, что вызывается метод mav.addObject().Ответ на стороне клиента имеет ожидаемый код состояния, но тип содержимого — text/htmlс html в теле, а не содержимое JSON или XLM, указанное в Accept. ] в исходном запросе.

(Примечание: фактическое исключение, код ответа и текстовое сообщение в приведенном выше примере не важны, они просто служат простым примером.)

Версия Spring: 3.1.1.RELEASE

9
задан matsev 5 June 2012 в 18:03
поделиться