У меня есть класс сообщений об ошибках:
@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