我们知道用@ControllerAdvice注解配合
@ExceptionHandler(XXXException.class) public ApiResultDto handleBizException(XXXException e) { // 获取异常消息 return ApiResultDtoUtil.error(e.getCode(), e.getMessage()); }
可以处理controller的全局异常,有时我们会继承ResponseEntityExceptionHandler类,这个类里默认帮我们处理了一些spring里自带的异常。但是这里面有坑,一旦继承了这个类,访问接口时,一些默认的异常返回的json内容是空。
比如我的cotroller里有一个接口中
@RequestMapping("/test") public Object test(@RequestParam String a){ return a; }
这时如果我在postman里直接不传参数a来访问localhost:8080/test接口,那么返回的结果会是空
而我们如果不使用全局异常处理的话,它返回的结果应该是
{ "timestamp": "2020-03-24T04:07:55.786+0000", "status": 400, "error": "Bad Request", "message": "Required String parameter 'a' is not present", "path": "/test" }
为什么会这样呢?我们点开ResponseEntityExceptionHandler类的源码可以看到,它里面是帮我们实现了spring里默认的异常处理,但是最后返回json时body里全部设的是null,所以我们在postman里得到的结果就是空。我们如果想得到上面那样异常信息,则需要重写ResponseEntityExceptionHandler里面的方法,把body设成我们想返回的Json值即可,相当于自定义返回的json数据格式。
当然还有一个最简单的方法就是,如果我们其它的异常不需要自定义json的返回格式,那么我们不继承ResponseEntityExceptionHandler类,这样除了我们自定义的异常的处理@ExceptionHandler外,其它的异常则都会由spring的默认异常处理器DefaultHandlerExceptionResolver来处理,这样也会得到上面的异常信息。