我创建了一个 REST Controller ,它可以像往常一样使用 Spring MVC 处理 GET、POST、PUT 和 DELETE HTTP 请求。 Web 服务器是 Tomcat 8。 例如,如果使用 HEAD 方法发送请求,则响应是来自 Tomcat 的带有消息的错误页面
HTTP Status 501 - Method LINK is not is not implemented by this servlet for this URI
我有这样的异常处理程序:
@ResponseBody
@ExceptionHandler(Throwable.class)
public ResponseEntity<?> exceptionHandler() {
Error error = createError("error_message.unforeseen_error");
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error);
}
但在这种情况下它没有发现任何错误。
有没有办法发回用 JSON 对象包装的消息作为响应而不是这个 Tomcat 页面?
最佳答案
问题是 SpringMVC 在你的 Controller 中没有找到任何 HEAD 方法,所以它没有使用它,你的 @ExceptionHandler 也没有被使用。它将用于 Controller 内部出现的异常。摘自 Spring Frameword 引用:您在 Controller 中使用 @ExceptionHandler 方法注释来指定在 Controller 方法执行期间抛出特定类型的异常时调用哪个方法(强调我的)。
要在任何 Controller 之外处理异常,您必须注册一个 HandlerExceptionResolver
bean,它将替换 Spring MVC 默认提供的 DefaultHandlerExceptionResolver
。您可以直接将 Json 字符串放入响应中并从 resolve
方法返回 null(我的首选方式),或者将元素放入模型中并使用 View 来格式化 Json。
关于rest - 当不支持 HTTP 方法时向客户端发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29749105/