【发布时间】:2012-06-08 18:59:22
【问题描述】:
背景
我有一个错误消息类:
@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;
}
}
这个类已作为返回值分配给我的 Spring MVC REST 控制器中的 @ExceptionHandler:
@ExceptionHandler
@ResponseStatus(HttpStatus.NOT_FOUND)
@ResponseBody
ErrorMessage handleException(RuntimeException e) {
return new ErrorMessage("something went wrong");
}
每当客户端在发出带有application/json 作为Accept 标头的请求后触发RuntimeException 时,它都会收到带有正确状态代码和匹配JSON 正文的响应:
{"error":"something went wrong"}
或者,如果Accept 标头是application/xml,则接收 XML 正文:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<errorMessage><error>something went wrong</error></errorMessage>
问题
现在,我想通过实现 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,而不是原始请求中 Accept 标头指定的 JSON 或 XLM 内容。
(旁注,上例中的实际异常、响应代码和短信并不重要,它们只是作为简单示例。)
春季版:3.1.1.RELEASE
【问题讨论】:
标签: java spring rest spring-mvc content-type