在阅读了一些关于为Spring创建自定义异常处理程序的博客文章后,我编写了以下类:
@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(value = Exception.class)
@ResponseBody
public ResponseEntity<Object> exceptionHandler(Exception e) {
HashMap<String, Object> msg = new HashMap<>(2);
msg.put("error", HttpStatus.PRECONDITION_FAILED.value());
msg.put("message", "Something went wrong");
return new ResponseEntity<>(msg, HttpStatus.BAD_REQUEST);
}
}
目的是在JSON响应中发送msg
,而不是泄露出因任何原因抛出的Spring异常。
然而,这个课程不起作用。
当我点击我的服务器API的端点和无效端点时,我得到了默认的响应有效负载:
{
"timestamp": 1449238700342,
"status": 405,
"error": "Method Not Allowed",
"exception": "org.springframework.web.HttpRequestMethodNotSupportedException",
"message": "Request method 'POST' not supported",
"path": "/bad_enpoint"
}
我错过了什么?
感谢。
答案 0 :(得分:2)
@ControllerAdvice
(我不知道为什么我必须单调地进行格式化)
public class RestExceptionHandler {
@ExceptionHandler(value = Exception.class)
@ResponseBody
public ResponseEntity<String> exceptionHandler(Exception e) {
return new ResponseEntity<>("Something went wrong", HttpStatus.BAD_REQUEST);
}
}
答案 1 :(得分:2)
您的处理程序将不会被调用,因为您要将Exception
映射到自定义错误响应,但Spring MVC很可能已经为Exception
类注册了一个异常处理程序。它还有一个可以肯定地处理HttpRequestMethodNotSupportedException
。
然而,无论如何,覆盖整个Spring MVC异常处理/映射并不是一个好主意。您应该只关心特定的例外 - 您定义的例外。
请阅读this article以了解更多有关Spring MVC异常处理的信息。