Loading... ## 前言: 首先我们复习一下`@RestController`和`@Controller`的区别: 关系:`@RestController` =` @Controller` + `@ResponseBody` ### @Controller: `@Controller`注解 默认只能返回要跳转的路径即跳转的html/JSP页面。 只有添加了 `@ResponseBody`注解后才可以返回 方法中 指定的返回类型。 ### @RestController `@RestController` 注解 ,则返回的是方法指定的返回类型。 * 如果返回类型为ModelAndView则返回指定的jsp页面 * 如果是String 则返回字符串 * 如果是JSONObject 则返回json对象 ## 如法炮制: `@RestControllerAdvice` = `@ControllerAdvice` + `@ResponseBody` ### @ControllerAdvice @ControllerAdvice是@Controller的一个增强版,可以实现三个方面的功能:**全局异常处理**、**全局数据绑定**、**全局数据预处理**。 @ControllerAdvice 捕获异常后,如果需要页面跳转就不能加@ResponseBody,加了则该方法返回的是json数据。 ### @RestControllerAdvice `@RestControllerAdvice`注解的类,执行方法时是无法页面跳转的,等价于`@ControllerAdvice`+`@ResponseBody`,表示该方法返回json数据。 如果全部异常处理返回json,那么可以使用 @RestControllerAdvice 代替 @ControllerAdvice,这样在方法上就可以不需要添加 @ResponseBody。 ## 代码区别:(返回前端JSON) ### 自定义异常: ```java package cn.bdmcom.exception; /** * @code Description * @code author 本当迷 * @code date 2022/9/26-14:49 */ public class ServiceException extends RuntimeException{ private static final long serialVersionUID = 1L; private String code; public ServiceException(String code, String msg) { super(msg); this.code = code; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } } ``` ### 使用@ControllerAdvice ```java /** * 统一处理异常通知类 */ @ControllerAdvice @Slf4j public class BaseExceptionHandler { /** * 处理自定义业务异常 * @param serviceException * @return */ @ExceptionHandler(ServiceException.class) @ResponseStatus(HttpStatus.BAD_REQUEST)// 设置返回的http status 状态码 @ResponseBody public R<String> exceptionHandler (ServiceException serviceException) { // 打印异常日志并输出错误代码定位 log.error("业务异常", serviceException); return R.error(serviceException.getCode(), serviceException.getMessage()); } } ``` ### 使用@RestControllerAdvice ```java /** * 统一处理异常通知类 */ @RestControllerAdvice @Slf4j public class BaseExceptionHandler { /** * 处理自定义业务异常 * @param serviceException * @return */ @ExceptionHandler(ServiceException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) // 设置返回的http status 状态码 public R<String> exceptionHandler (ServiceException serviceException) { // 打印异常日志并输出错误代码定位 log.error("业务异常", serviceException); return R.error(serviceException.getCode(), serviceException.getMessage()); } } ``` ## 总结: 因为对于这两个注解我只用过和全局异常 **@ExceptionHandler** 处理进行搭配使用,所以只介绍springboot使用全局异常 * 如果我们使用全局异常要**进行页面跳转**: 类上使用`@ControllerAdvice`和方法上使用`@ExceptionHandler`进行搭配 * 如果我们使用全局异常只是返回前端JSON数据: 类上使用`@RestControllerAdivce`和方法上使用`@ExceptionHandler`进行搭配 * 如果我们既要进行页面跳转又要返回前端JSON数据 类上使用`@ControllerAdvice`和方法上使用`@ExceptionHandler`并且加上`@ResponseBody` 最后修改:2022 年 09 月 26 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果文章有用,请随意打赏。