@ControllerAdvice(实现全局异常、全局参数、请求参数预处理)

近期看到了ControllerAdvice这个注解,本身只是为了看下全局异常处理的,简单了解后发现可以分别与@ExceptionHandler、@ModelAttribute、@InitBinder实现 全局异常、全局参数、请求参数预处理 的功能。

目录

  • 一、全局异常处理
  • 二、全局参数处理
  • 三、请求参数预处理

一、全局异常处理

实现全局异常处理需要配合@ExceptionHandler注解进行处理

导入maven

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<!-- 阿里巴巴json转换 -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.75</version>
</dependency><!-- lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.6</version><scope>provided</scope>
</dependency><!-- 校验包 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>

自定义处理器代码

import com.zhangximing.springboot_annotate.pojo.ErrorResponse;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;//全局处理器
@ControllerAdvice
public class GlobalHandler {// 异常处理器@ExceptionHandler(Exception.class)@ResponseBodypublic ErrorResponse handleException(Exception e) {// 这里可以根据需要记录异常信息,发送通知等System.err.println("发生异常: " + e.getMessage());// 返回错误信息ErrorResponse response = new ErrorResponse(500,"服务器发生异常("+e.getMessage()+"),请稍后重试");return response;}
}

实体代码

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 异常处理实体*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ErrorResponse {private int code;private String message;
}
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.http.HttpStatus;/***  统一API响应结果封装实体*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {private int code;private String message;private Object data;public static Result success() {return new Result(HttpStatus.OK.value(), "操作成功", null);}public static Result success(Object data) {return new Result(HttpStatus.OK.value(), "操作成功", data);}public static Result error(String message) {return new Result(HttpStatus.BAD_REQUEST.value(), message, null);}
}

测试方法

import com.alibaba.fastjson.JSONObject;
import com.zhangximing.springboot_annotate.pojo.Result;
import lombok.SneakyThrows;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/test")
public class TestController {// 测试全局异常@SneakyThrows@RequestMapping("/globalException")public Result globalException(@Validated @RequestBody JSONObject param) {// 设置验证门槛String authCode = param.getString("authCode");// 验证不通过抛异常if (null == authCode || !"XM_PASS".equals(authCode.trim())){throw new Exception("authCode error");}return Result.success();}
}

测试结果

在这里插入图片描述

二、全局参数处理

实现全局参数处理需要配合@ModelAttribute注解进行处理
引入的pom以及实体代码与上同

import com.zhangximing.springboot_annotate.pojo.ErrorResponse;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.beans.propertyeditors.StringTrimmerEditor;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;//全局处理器
@ControllerAdvice
public class GlobalHandler {// 设置全局参数@ModelAttributepublic void presetParam(Model model){model.addAttribute("globalAttr","globalAttr_Number1");}//    //注意@ModelAttribute若加括号不传任何参数的时候默认key为map,这种写法与上述写法不一致之处在于会包裹一层map
//    @ModelAttribute()
//    public Map<String, String> presetParam(){
//        Map<String, String> map = new HashMap<String, String>();
//        map.put("globalAttr", "globalAttr_Number2");
//        return map;
//    }
}

测试方法

// 测试全局预设参数
// 预设情况一 (直接model转换map)
@GetMapping("presetOne")
public String presetOne(Model model){Map<String, Object> modelMap = model.asMap();return JSONObject.toJSONString(modelMap);
}// 预设情况二(指定全局异常变量)
@GetMapping("presetTwo")
public String presetTwo(@ModelAttribute("globalAttr") String globalAttr){return globalAttr;
}// 预设情况三(指定modelMap对象)
@GetMapping("presetThree")
public String presetThree(ModelMap modelMap) {return JSONObject.toJSONString(modelMap);
}

测试结果

在这里插入图片描述

三、请求参数预处理

实现请求参数预处理需要配合@InitBinder注解进行处理
这部分参考了博客:https://blog.csdn.net/qq_36829919/article/details/101210250

import com.zhangximing.springboot_annotate.pojo.ErrorResponse;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.beans.propertyeditors.StringTrimmerEditor;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;//全局处理器
@ControllerAdvice
public class GlobalHandler {// 请求参数预处理@InitBinderpublic void processParam(WebDataBinder dataBinder){/** 创建一个字符串微调编辑器* 参数{boolean emptyAsNull}: 是否把空字符串("")视为 null*/StringTrimmerEditor trimmerEditor = new StringTrimmerEditor(true);/** 注册自定义编辑器* 接受两个参数{Class<?> requiredType, PropertyEditor propertyEditor}* requiredType:所需处理的类型* propertyEditor:属性编辑器,StringTrimmerEditor就是 propertyEditor的一个子类*/dataBinder.registerCustomEditor(String.class, trimmerEditor);//同上,当日期类型时dataBinder.registerCustomEditor(Date.class,new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), false));}
}

测试方法

// 测试全局预处理
@RequestMapping("initDeal")
public Map<String, Object> test(String str, Date date) throws Exception {Map<String, Object> map = new HashMap<String, Object>();map.put("str", str);map.put("data", date);return map;
}

测试结果

在这里插入图片描述

个人理解:ControllerAdvice该注解的作用原理跟aop相似,都是进行拦截,而需要拦截处理的具体功能是由其他注解来协助(类似于aop的Advice)。
以上我学习整理的ControllerAdvice注解的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/660845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LPC804开发(11.ADC使用)

1.前言 刚刚研究ADC的时候发现芯片里面还有应该mrt 16位的定时器没有搞&#xff0c;那回头补上吧。下午研究了一下ADC的使用&#xff0c;我也只是能用上&#xff0c;这里我只是抛砖引玉一下吧&#xff0c;有需要的还请各位自行深入探究&#xff0c;我这里讲解的是软件触发模式…

AI工具【OCR 01】Java可使用的OCR工具Tess4J使用举例(身份证信息识别核心代码及信息提取方法分享)

Java可使用的OCR工具Tess4J使用举例 1.简介1.1 简单介绍1.2 官方说明 2.使用举例2.1 依赖及语言数据包2.2 核心代码2.3 识别身份证信息2.3.1 核心代码2.3.2 截取指定字符2.3.3 去掉字符串里的非中文字符2.3.4 提取出生日期&#xff08;待优化&#xff09;2.3.5 实测 3.总结 1.简…

Unity SRP 管线【第九讲:URP 点光源与聚光灯】

文章目录 CPU数据搜集GPU数据使用光照计算 CPU数据搜集 我们只能支持有限数量的其他灯。并将这些灯光数据&#xff08;位置、颜色、阴影强度、方向光光源、灯光遮蔽Probe、灯光层级Mask&#xff09;发送到GPU以供场景中所有物体渲染使用。 //ForwardLights.cs 额外光源数量与…

qt内存自动释放的两种情况

qt内存管理机制 QObject的parent 我们时常能看到QWidget或者其他的控件的构造函数中有一项参数parent&#xff0c;默认值都为NULL&#xff0c;例如&#xff1a; QLineEdit(const QString &contents, QWidget *parent nullptr); QWidget(QWidget *parent nullptr, Qt::…

vue3学习——初始化项目及配置

初始化项目 环境 node 16pnpm 8.0.0 命令 pnpm create vite进行以下选择 &#x1f447; – 项目名 – VUe – Ts – cd/目录 – pnpm run dev 浏览器自动打开 package.json 配置eslint 安装依赖包 pnpm i eslint -D npx eslint --init // 生成配置文件进行以下选择 &a…

【2024】大三寒假再回首:缺乏自我意识是毒药,反思和回顾是解药

2024年初&#xff0c;学习状态回顾 开稿时间&#xff1a;2024-1-23 归家百里去&#xff0c;飘雪送客迟。 搁笔日又久&#xff0c;一顾迷惘时。 我们饱含着过去的习惯&#xff0c;缺乏自我意识是毒药&#xff0c;反思和回顾是解药。 文章目录 2024年初&#xff0c;学习状态回顾一…

vue——实现多行粘贴到table事件——技能提升

最近在写后台管理系统时&#xff0c;遇到一个需求&#xff0c;就是要从excel表格中复制多行内容&#xff0c;然后粘贴到后台系统中的table表格中。 如下图所示&#xff1a;一次性复制三行内容&#xff0c;光标放在红框中的第一个框中&#xff0c;然后按ctrlv粘贴事件&#xff0…

掌上医院预约挂号缴费系统源码,与医院信息系统共享数据,实现在线预约挂号、移动支付、医保支付、检验检查报告查看、门诊病历查询等功能。

随着信息技术的发展和互联网的普及&#xff0c;越来越多的患者开始习惯于通过互联网获取医疗服务。网上预约挂号是近年来开展的一项便民就医服务&#xff0c;旨在缓解看病难、挂号难的就医难题&#xff0c;许多患者为看一次病要跑很多次医院&#xff0c;最终还不一定能保证看得…

MySQL数据控制语言DCL

MySQL数据控制语言DCL 目录 MySQL数据控制语言DCLDCL关键字1.事务事务的四大特性START TRANSACTION&#xff1a;开始事务ROLLBACK&#xff1a;回滚COMMIT&#xff1a;提交事务 2.用户权限CREATE USER&#xff1a;创建新的用户并指定权限DROP USER&#xff1a;删除用户ALTER USE…

深度强化学习(王树森)笔记10

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

LeetCode —— 17. 电话号码的字母组合

&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️…

基于人体姿态的目标追踪实现

文章目录 概要人体姿态识别人体关键点转检测框实时跟踪器概要 这篇博文简单介绍了如何实现基于人体姿态的多目标跟踪算法。主要分为以下几个步骤: 基于FastDeploy实现人体姿态识别;将人体姿态转化为检测框;基于SORT算法实现目标跟踪。人体姿态识别 参考Fastdeploy实现。 模…

Ubuntu系统硬盘分区攻略(磁盘分区、RAID磁盘阵列、RAID阵列、固态硬盘分区、机械硬盘分区、swap分区、swap交换分区)

文章目录 分区需求分区方案分区顺序相关疑问swap分区不是应该放在最后吗&#xff1f;我安装系统分区的时候&#xff0c;上面有available devices&#xff0c;下面有create software raid(md)&#xff0c;我该用哪个&#xff1f;我available devices下面有个893G的固态&#xff…

Selenium自动化测试 —— 模拟鼠标键盘的操作事件

鼠标操作事件 在实际的web产品测试中&#xff0c;对于鼠标的操作&#xff0c;不单单只有click()&#xff0c;有时候还要用到右击、双击、拖动等操作&#xff0c;这些操作包含在ActionChains类中。 ActionChains类中鼠标操作常用方法&#xff1a; 首先导入ActionChains类&#…

Python OpenCV实现图片像素区域缩放

Python OpenCV实现图片像素区域缩放 前言项目安装OpenCV和Pillow思路代码编写 前言 遇到一个要将大量图片缩放成统一规格的难题&#xff0c;并且这些图片周围还有很多空白像素&#xff0c;所以用Python实现一下。 项目 安装OpenCV和Pillow pip install opencv-python pip …

C++:异常体系

异常体系 异常1.C语言传统的处理错误的方式2.C异常概念3.异常的使用3.1异常的抛出和捕获3.2 异常的重新抛出3.3异常安全3.4 异常规范 4.C标准库的异常体系5.异常的优缺点 异常 1.C语言传统的处理错误的方式 终止程序&#xff0c;如assert&#xff0c;缺陷&#xff1a;用户难以…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TextClock组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之TextClock组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、TextClock组件 TextClock组件通过文本将当前系统时间显示在设备上。支持不同…

Pytorch从零开始实战18

Pytorch从零开始实战——人脸图像生成 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——人脸图像生成环境准备模型定义开始训练可视化总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;Pytorch2.0.1cu118&#…

【2024年美赛即将开赛】最后一天如何提高获奖率

美赛思路预定 01 美赛赛中时间分配美赛时间安排比赛前2~3天第一天&#xff08;2号&#xff09;第二天&#xff08;3号&#xff09;第三天&#xff08;4号&#xff09;第四天&#xff08;5号&#xff09;第五天&#xff08;6号&#xff09;8&#xff1a;00~10&#xff1a;00 02 …

Hadoop-生产调优(更新中)

第1章 HDFS-核心参数 1.1 NameNode内存生产配置 1&#xff09;NameNode 内存计算 每个文件块大概占用 150 byte&#xff0c;一台服务器 128G 内存为例&#xff0c;能存储多少文件块呢&#xff1f; 128 * 1024 * 1024 * 1024 / 150byte ≈ 9.1 亿G MB KB Byte 2&#xff09…