解决使用@ControllerAdvice继承ResponseEntityExceptionHandler处理异常时的坑

我们知道用@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来处理,这样也会得到上面的异常信息。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
当我们在编写 Spring MVC 应用程序,我们可以使用 @ControllerAdvice 注解或者在 Controller使用 @ExceptionHandler 注解来处理异常。@ControllerAdvice 注解可以用于全局异常处理,而 @ExceptionHandler 注解则用于处理特定的异常。 下面是一个使用 @ControllerAdvice 注解处理异常的示例: ``` @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ModelAndView handleException(Exception e) { ModelAndView mav = new ModelAndView(); mav.addObject("exception", e); mav.setViewName("error"); return mav; } } ``` 在上面的示例中,我们定义了一个名为 GlobalExceptionHandler 的类,并使用 @ControllerAdvice 注解将其标记为全局异常处理器。我们还使用 @ExceptionHandler 注解来处理 Exception 类型的异常。当应用程序中出现 Exception 类型的异常,Spring MVC 将会调用 handleException 方法来处理异常,并返回一个包含异常信息的 ModelAndView 对象。 如果我们想要在 Controller处理特定的异常,我们可以使用 @ExceptionHandler 注解。下面是一个使用 @ExceptionHandler 注解处理特定异常的示例: ``` @Controller public class UserController { @ExceptionHandler(UserNotFoundException.class) public ModelAndView handleUserNotFoundException(UserNotFoundException e) { ModelAndView mav = new ModelAndView(); mav.addObject("exception", e); mav.setViewName("userNotFound"); return mav; } @GetMapping("/users/{id}") public String getUser(@PathVariable Long id) { User user = userService.getUserById(id); if (user == null) { throw new UserNotFoundException("User not found with id " + id); } return "userDetails"; } } ``` 在上面的示例中,我们定义了一个名为 UserController 的类,并使用 @Controller 注解将其标记为一个 Controller。我们还使用 @ExceptionHandler 注解来处理 UserNotFoundException 类型的异常。当应用程序中出现 UserNotFoundException 类型的异常,Spring MVC 将会调用 handleUserNotFoundException 方法来处理异常,并返回一个包含异常信息的 ModelAndView 对象。 另外,我们还定义了一个名为 getUser 的方法来获取用户信息。如果用户不存在,我们将会抛出一个 UserNotFoundException 异常,该异常将会被 handleUserNotFoundException 方法处理
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值