千家信息网

@RestControllerAdvice与@ControllerAdvice的区别是什么

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章将为大家详细讲解有关@RestControllerAdvice与@ControllerAdvice的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识
千家信息网最后更新 2026年11月01日@RestControllerAdvice与@ControllerAdvice的区别是什么

这篇文章将为大家详细讲解有关@RestControllerAdvice与@ControllerAdvice的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

@RestControllerAdvice与@ControllerAdvice的区别

@RestControllerAdvice注解与@ControllerAdvice注解位于同一个依赖包下面,其pom依赖为:

    org.springframework    spring-web    5.3.3

有时会发现在不同的项目中,全局异常处理部分,有的自定义类添加@RestControllerAdvice注解,有的自定义类添加@ControllerAdvice注解。

其实这两个注解的作用基本上是一致的,都是为了实现自定义全局异常处理,

唯一的区别是:@RestControllerAdvice注解包含了@ControllerAdvice注解和@ResponseBody注解。

@ControllerAdvice注解的源码为

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface ControllerAdvice { }

@RestControllerAdvice注解的源码为

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@ControllerAdvice@ResponseBodypublic @interface RestControllerAdvice { }

当自定义类加@ControllerAdvice注解时,方法需要返回json数据时,每个方法还需要添加@ResponseBody注解

当自定义类加@RestControllerAdvice注解时,方法自动返回json数据,每个方法无需再添加@ResponseBody注解

/** * 全局异常处理类 */@RestControllerAdvice@Slf4jpublic class GlobalExceptionHandler {  @ExceptionHandler(Exception.class) public Result ExceptionHandler(Exception e) {  log.error("出现异常:", e);  return Result.failed(e.getMessage()); }}

@RestControllerAdvice @ControllerAdvice注解无效 通用异常处理

简单记录下,今天打算写一个公共异常处理切面,主要是将所有抛出的异常拦截,然后返回给前端的时候,统一是错误码,错误原因等。防止直接在前端抛出错误。

@RestControllerAdvice 或者 @ControllerAdvice 可以直接作为错误处理的切面对待。但是使用过程中发现这两个注解无效,原因是我将GlobalExceptionHandler定义在另一个包里面,@SpringBootApplication无法自动加载到该注解(springboot启动类的默认扫描路径是该类所在的包下面的所有java类。

如:启动类在"com.galen.cloud.portal"包下,那么只有com.galen.cloud.portal包下的类会被扫描加载)。所以添加上对应的scanBasePackages 即可(我这边改为扫描所有匹配com.galen.*的包):

启动类

package com.galen.cloud.portal;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication(scanBasePackages = "com.galen.*")public class galenPortalApplication {    public static void main(String[] args) {        SpringApplication.run(galenPortalApplication.class, args);    }}

错误处理类

package com.galen.common.exception;import com.galen.common.core.domain.R;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.core.annotation.AnnotationUtils;import org.springframework.dao.DuplicateKeyException;import org.springframework.http.HttpStatus;import org.springframework.web.HttpRequestMethodNotSupportedException;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.ResponseStatus;import org.springframework.web.bind.annotation.RestControllerAdvice;/** * 异常处理器 * @author galen */@RestControllerAdvicepublic class GlobalExceptionHandler{    private Logger logger = LoggerFactory.getLogger(getClass());    /**     * 请求方式不支持     */    @ExceptionHandler({HttpRequestMethodNotSupportedException.class})    @ResponseStatus(code = HttpStatus.METHOD_NOT_ALLOWED)    public R handleException(HttpRequestMethodNotSupportedException e)    {        logger.error(e.getMessage(), e);        return R.error("不支持' " + e.getMethod() + "'请求");    }    /**     * 拦截未知的运行时异常     */    @ExceptionHandler(RuntimeException.class)    public R notFount(RuntimeException e)    {        if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null)        {            throw e;        }        logger.error("运行时异常:", e);        return R.error("运行时异常:" + e.getMessage());    }    /**     * 处理自定义异常     */    @ExceptionHandler(galenException.class)    public R handleWindException(galenException e)    {        return R.error(e.getCode(), e.getMessage());    }    @ExceptionHandler(DuplicateKeyException.class)    public R handleDuplicateKeyException(DuplicateKeyException e)    {        logger.error(e.getMessage(), e);        return R.error("数据库中已存在该记录");    }    @ExceptionHandler(Exception.class)    public R handleException(Exception e) throws Exception    {        logger.error(e.getMessage(), e);        return R.error("服务器错误,请联系管理员");    }    /**     * 捕获并处理未授权异常     *     * @param e 授权异常     * @return 统一封装的结果类, 含有代码code和提示信息msg     */    @ExceptionHandler(UnauthorizedException.class)    public R handle401(UnauthorizedException e)    {        return R.error(401, e.getMessage());    }    // 验证码错误    @ExceptionHandler(ValidateCodeException.class)    public R handleCaptcha(ValidateCodeException e)    {        return R.error(e.getMessage());    }}

最后拦截效果图如下:

关于@RestControllerAdvice与@ControllerAdvice的区别是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

注解 处理 错误 方法 全局 数据 运行 两个 内容 切面 前端 原因 文章 更多 源码 知识 篇文章 支持 统一 不同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 咖啡豆 博彦科技互联网金融 科技金融是不是互联网金融 科技创新与互联网经济 互联网巨头反垄断金融科技 喔噻互联网科技 互联网科技公司电话 有马互联网科技 西安互联网科技公司 互联网巨头投资的硬核科技 深圳互联网科技怎么样 团飞科技与伯堂互联网服务平台 互联网科技公司实习生 浙南科技城互联网大厦建设工程 翼展科技 首家互联网医院 威龙国际互联网科技公司 科技赋能视角下互联网保险发展 富国互联网科技002692 求路客互联网科技电话 第三届互联网大会安防黑科技 湖南永感互联网科技有限公司 互联网科技公司的优势 与互联网科技公司 互联网科技公司怎么样 嘟嘟瓜互联网科技 央行互联网金融科技公司 全球顶尖互联网科技公司 深圳育鹏互联网科技有限公司招聘 山东星卡互联网科技有限公司官网 上海同邻互联网科技有限公司规模
0