当前位置: 首页 > news >正文

@RestControllerAdvice 的作用

系列博客目录


文章目录

  • 系列博客目录
  • 1.@ControllerAdvice 有什么用
      • 主要功能
  • 2.与 `@RestControllerAdvice` 的区别
  • 3.苍穹外卖中的使用
  • 4.@RestControllerAdvice可以指定范围吗
    • (1)指定应用到某些包中的 `@RestController`
    • (2)指定应用到具有特定注解的 `@RestController`
    • (3)指定应用到特定的 `@RestController` 类
    • (4)组合使用多个限制条件
    • 小结
  • 总结


1.@ControllerAdvice 有什么用

@ControllerAdvice 是 Spring 框架提供的一个用于处理全局异常、数据绑定、模型属性等的注解。它可以用来集中处理应用中的异常、日志记录、数据预处理等常见任务,从而减少重复的代码,提高可维护性。

主要功能

  1. 全局异常处理
    @ControllerAdvice 允许你在一个集中位置处理控制器(@Controller)抛出的异常。这样,你就不需要在每个控制器方法中写重复的异常处理代码。

    @ControllerAdvice
    public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<String> handleException(Exception ex) {return new ResponseEntity<>("Global exception: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);}
    }
    

    上面的代码会捕获所有控制器抛出的 Exception 异常,并返回统一的响应。

  2. 全局数据绑定
    @ControllerAdvice 还可以用于设置全局的模型属性,比如向所有的视图中添加一些通用数据(如当前用户信息等)。

    @ControllerAdvice
    public class GlobalModelAttributes {@ModelAttribute("user")public User addUser() {return new User("John", "Doe");}
    }
    

    这里,user 将会自动成为所有视图模型中的一个属性。

  3. 全局 @InitBinder
    @InitBinder 方法可以用于设置 Web 层的数据绑定配置。通过 @ControllerAdvice 可以设置全局的数据绑定方法,比如日期格式、字符串的修剪等。

    @ControllerAdvice
    public class GlobalBinderConfig {@InitBinderpublic void initBinder(WebDataBinder binder) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));}
    }
    

    通过 @InitBinder,你可以为所有的控制器设置全局的数据绑定规则。

  4. 局部作用域
    如果你不希望 @ControllerAdvice 处理全局的异常,也可以通过 @RestControllerAdvice 或者指定 basePackages 限制 @ControllerAdvice 的作用范围,使其仅对指定的包或类有效。

2.与 @RestControllerAdvice 的区别

  • @ControllerAdvice 用于传统的基于视图的控制器(即返回视图页面的控制器)。
  • @RestControllerAdvice 是专门为 @RestController 设计的,通常用于处理返回 JSON 或 XML 的 RESTful API,它是 @ControllerAdvice@ResponseBody 的组合。

3.苍穹外卖中的使用

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {/*** 捕获业务异常* @param ex* @return*/@ExceptionHandlerpublic Result exceptionHandler(BaseException ex){log.error("异常信息:{}", ex.getMessage());return Result.error(ex.getMessage());}}

4.@RestControllerAdvice可以指定范围吗

是的,@RestControllerAdvice 也可以指定范围,类似于 @ControllerAdvice。你可以通过以下几种方式来限制 @RestControllerAdvice 的作用范围:

(1)指定应用到某些包中的 @RestController

使用 basePackages 属性,你可以限制 @RestControllerAdvice 只作用于某些包中的 @RestController 类。

@RestControllerAdvice(basePackages = "com.example.demo.rest")
public class RestControllerExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<String> handleException(Exception ex) {return new ResponseEntity<>("REST exception: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);}
}

在这个例子中,@RestControllerAdvice 只会作用于 com.example.demo.rest 包中的 @RestController 控制器。

(2)指定应用到具有特定注解的 @RestController

你可以使用 annotations 属性,限制 @RestControllerAdvice 只作用于具有特定注解的控制器。例如,@RestController 或其他自定义注解。

@RestControllerAdvice(annotations = RestController.class)
public class RestControllerExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<String> handleRestControllerException(Exception ex) {return new ResponseEntity<>("REST controller exception: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);}
}

这意味着 @RestControllerAdvice 只会影响被 @RestController 注解标记的控制器类。

(3)指定应用到特定的 @RestController

你还可以通过 assignableTypes 属性来限制 @RestControllerAdvice 只作用于某些指定类型的控制器类。

@RestControllerAdvice(assignableTypes = MyRestController.class)
public class SpecificRestControllerExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<String> handleSpecificRestControllerException(Exception ex) {return new ResponseEntity<>("Exception in MyRestController: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);}
}

在这个例子中,@RestControllerAdvice 只会作用于 MyRestController 类中的 @RestController

(4)组合使用多个限制条件

你还可以结合多种属性来进一步细化 @RestControllerAdvice 的应用范围,例如同时指定 basePackagesannotations

@RestControllerAdvice(basePackages = "com.example.demo.rest", annotations = RestController.class)
public class RestControllerExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<String> handleRestControllerException(Exception ex) {return new ResponseEntity<>("REST API exception: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);}
}

小结

@RestControllerAdvice 提供了类似于 @ControllerAdvice 的功能,可以通过 basePackagesannotationsassignableTypes 等属性来精确控制其适用范围。这样,你就可以将它限制在特定的包、注解或控制器类中,从而避免不必要的影响,增强代码的可维护性和清晰性。

总结

@ControllerAdvice 是 Spring 中一种集中处理异常、模型属性、数据绑定等的机制,它让你可以在一个地方集中管理所有控制器相关的操作,从而使得代码更加简洁和可维护。

相关文章:

@RestControllerAdvice 的作用

系列博客目录 文章目录 系列博客目录1.ControllerAdvice 有什么用主要功能 2.与 RestControllerAdvice 的区别3.苍穹外卖中的使用4.RestControllerAdvice可以指定范围吗&#xff08;1&#xff09;指定应用到某些包中的 RestController&#xff08;2&#xff09;指定应用到具有特…...

k均值聚类将数据分成多个簇

K-Means 聚类并将数据分成多个簇&#xff0c;可以使用以下方法&#xff1a; 实现思路 随机初始化 K 个聚类中心计算每个点到聚类中心的距离将点分配到最近的簇更新聚类中心重复上述过程直到收敛 完整代码&#xff1a; import torch import matplotlib.pyplot as pltdef kme…...

书生大模型实战营2

L0——入门岛 Python基础 Conda虚拟环境 虚拟环境是Python开发中不可或缺的一部分&#xff0c;它允许你在不同的项目中使用不同版本的库&#xff0c;避免依赖冲突。Conda是一个强大的包管理器和环境管理器。 创建新环境 首先&#xff0c;确保你已经安装了Anaconda或Minico…...

Excel 技巧21 - Excel中整理美化数据实例,Ctrl+T 超级表格(★★★)

本文讲Excel中如何整理美化数据的实例&#xff0c;以及CtrlT 超级表格的常用功能。 目录 1&#xff0c;Excel中整理美化数据 1-1&#xff0c;设置间隔行颜色 1-2&#xff0c;给总销量列设置数据条 1-3&#xff0c;根据总销量设置排序 1-4&#xff0c;加一个销售趋势列 2&…...

前端——js高级25.1.27

复习&#xff1a;对象 问题一&#xff1a; 多个数据的封装提 一个对象对应现实中的一个事物 问题二&#xff1a; 统一管理多个数据 问题三&#xff1a; 属性&#xff1a;组成&#xff1a;属性名属性值 &#xff08;属性名为字符串&#xff0c;属性值任意&#xff09; 方…...

学习数据结构(4)顺序表+单链表

1.顺序表算法题 题三&#xff1a; 2.单链表 &#xff08;1&#xff09;概念 链表是⼀种物理存储结构上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 &#xff08;2&#xff09;节点 节点的组成主要有两个部分&#xff1a;当前节点要保…...

GIS 中的 SQLAlchemy:空间数据与数据库之间的桥梁

利用 SQLAlchemy 在现代应用程序中无缝集成地理空间数据导言 地理信息系统&#xff08;GIS&#xff09;在管理城市规划、环境监测和导航系统等各种应用的空间数据方面发挥着至关重要的作用。虽然 PostGIS 或 SpatiaLite 等专业地理空间数据库在处理空间数据方面非常出色&#…...

python:斐索实验(Fizeau experiment)

斐索实验&#xff08;Fizeau experiment&#xff09;是在1851年由法国物理学家阿曼德斐索&#xff08;Armand Fizeau&#xff09;进行的一项重要实验&#xff0c;旨在测量光在移动介质中的传播速度。这项实验的结果对当时的物理理论产生了深远的影响&#xff0c;并且在后来的相…...

MySQL查询优化(三):深度解读 MySQL客户端和服务端协议

如果需要从 MySQL 服务端获得很高的性能&#xff0c;最佳的方式就是花时间研究 MySQL 优化和执行查询的机制。一旦理解了这些&#xff0c;大部分的查询优化是有据可循的&#xff0c;从而使得整个查询优化的过程更有逻辑性。下图展示了 MySQL 执行查询的过程&#xff1a; 客户端…...

vue3相关知识点

title: vue_1 date: 2025-01-28 12:00:00 tags:- 前端 categories:- 前端vue3 Webpack ~ vite vue3是基于vite创建的 vite 更快一点 一些准备工作 准备后如图所示 插件 Main.ts // 引入createApp用于创建应用 import {createApp} from vue // 引入App根组件 import App f…...

基于springboot+vue的流浪动物救助系统的设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…...

MySQL(单表访问)

今天是新年&#xff0c;祝大家新年快乐&#xff0c;但是生活还是得继续。 后面也会持续更新&#xff0c;学到新东西会在其中补充。 建议按顺序食用&#xff0c;欢迎批评或者交流&#xff01; 缺什么东西欢迎评论&#xff01;我都会及时修改的&#xff01; 大部分截图和文章采…...

UE5.3 C++ CDO的初步理解

一.UObject UObject是所有对象的基类&#xff0c;往上还有UObjectBaseUtility。 注释&#xff1a;所有虚幻引擎对象的基类。对象的类型由基于 UClass 类来定义。 这为创建和使用UObject的对象提供了 函数&#xff0c;并且提供了应在子类中重写的虚函数。 /** * The base cla…...

SpringBoot 中的测试jar包knife4j(实现效果非常简单)

1、效果图 非常快的可以看见你实现的接口 路径http://localhost:8080/doc.html#/home 端口必须是自己的 2、实现效果 2.1、导入jar包 <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-openapi3-jakarta-spring-boot-star…...

Java Web 开发基础介绍

Java学习资料 Java学习资料 Java学习资料 一、引言 在当今数字化时代&#xff0c;Web 应用无处不在。Java 凭借其强大的功能、良好的跨平台性和丰富的开发框架&#xff0c;成为 Web 开发领域的热门选择之一。Java Web 开发允许开发者构建动态、交互式的 Web 应用程序&#x…...

Android Studio:视图绑定的岁月变迁(2/100)

一、博文导读 本文是基于Android Studio真实项目&#xff0c;通过解析源码了解真实应用场景&#xff0c;写文的视角和读者是同步的&#xff0c;想到看到写到&#xff0c;没有上帝视角。 前期回顾&#xff0c;本文是第二期。 private Unbinder mUnbinder; 只是声明了一个 接口…...

LabVIEW春节快乐

尊敬的LabVIEW开发者与用户朋友们&#xff1a; 灵蛇舞动辞旧岁&#xff0c;春风送暖贺新年&#xff01;值此癸巳蛇年新春佳节来临之际&#xff0c;向每一位深耕LabVIEW开发领域的伙伴致以最诚挚的祝福&#xff1a;愿您与家人在新的一年里平安顺遂、阖家幸福&#xff0c;事业如…...

rewrite规则

NGINX 中 rewrite最后的标记含义&#xff1a; flag标记有&#xff1a; last 相当于Apache里的[L]标记&#xff0c;表示完成rewrite&#xff0c;匹配完&#xff0c;再向下匹配。地址栏会显示跳转后的地址 break 终止匹配, 不再匹配后面的rewrite规则&#xff0c;地址栏会显示跳…...

Android车机DIY开发之学习篇(七)NDK交叉工具构建

Android车机DIY开发之学习篇(七)NDK交叉工具构建 1.ubuntu安装GCC sudo apt-get update sudo apt-get install gcc g sudo gcc --version sudo g --version 2.测试GCC VSCODE中新建Hello.c编译 #include <stdio.h> int main(void) { printf(“Hello, this is a progr…...

【初/高中生讲机器学习】0. 本专栏 “食用” 指南——写在一周年之际⭐

创建时间&#xff1a;2025-01-27 首发时间&#xff1a;2025-01-29 最后编辑时间&#xff1a;2025-01-29 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名高一学生&#xff0c;热爱计…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】&#xff0c;这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...

Xcode 16 集成 cocoapods 报错

基于 Xcode 16 新建工程项目&#xff0c;集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验

2024年初&#xff0c;人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目&#xff08;一款融合大型语言模型能力的云端AI编程IDE&#xff09;时&#xff0c;技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力&#xff0c;TRAE在WayToAGI等…...