在自定义ResponseEntityExceptionHandler中没有为Spring异常调用类型Exception的@ExceptionHandler

时间:2016-11-15 19:43:21

标签: java spring spring-boot spring-mvc

在阅读了一些关于为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"
}

我错过了什么?

感谢。

2 个答案:

答案 0 :(得分:2)

  1. 您无需扩展ResponseEntityExceptionHandler即可使其正常工作。
  2. 设置两个HttpStatuses是一个糟糕的主意。
  3. @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异常处理的信息。