@ControllerAdvice 统一管理异常/错误

@ControllerAdvice 统一管理异常/错误

文章目录

  • @ControllerAdvice 统一管理异常/错误
    • 一、注意事项
    • 二、统一管理异常/错误的好处
    • 三、代码实现
      • 1. 普通方法
      • 2. 统一管理@ControllerAdvice
      • 3. PostMan测试结果

一、注意事项

1. 如果校验注解不指定 message 属性 ,会返回默认消息, 这些消息是配置在
ValidationMessages_zh_CN.properties 文件中的, 这个文件是框架提供的(如图)
2. 写完验证注解后, 不要忘了在控制器开启校验, 将 @Validated 写在要校验的 Entity前, 否则不会生效
3. @NotNull 注解可以接受任意类型, @NotBlank(String) 和@ NotEmpty(数组、集合) 都有要求, 具体看源码即可

二、统一管理异常/错误的好处

1. 如果每一个 Controller 都分别写对数据校验异常的处理代码,非常繁琐,扩展性不高
2. 我们可以使用@ControllerAdvice 统一管理异常/错误

三、代码实现

1. 普通方法

实体类BrandEntity.java

package com.xjz.xjzliving.commodity.entity;import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import org.hibernate.validator.constraints.URL;import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;/*** 家居品牌** @author xjz* @email xjz@gmail.com* @date 2024-02-20 19:03:08*/
@Data
@TableName("commodity_brand")
public class BrandEntity implements Serializable {private static final long serialVersionUID = 1L;/*** id*/@TableIdprivate Long id;/*** 品牌名* 代码解读* 1. @NotBlank 表示 name 必须包括一个非空字符* 2. message = "品牌名不能为空" 是我指定的一个校验消息* 3. 如果不指定 message = " 品牌名不能为空" ,会返回默认消息* 	  javax.validation.constraints.NotBlank.message*  4. 这个消息是配置在 ValidationMessages_zh_CN.properties 文件中的*  5. 下面其它的校验注解规则一样,也很好理解*/@NotBlank(message = "品牌名不能为空")private String name;/*** logo* 1. @NotBlank 和 @URL 同时修饰 logo 是两个校验注解都要满足*/@NotBlank(message = "logo不能为空")@URL(message = "logo不是一个合法的URL")private String logo;/*** 说明*/private String description;/*** 显示* 代码解读* 1.这里使用了@NotNull 注解,该注解可以接受任意类型* 2.如果使用@NotBlank 注解,会报错,因为@NotBlank 不支持校验 Integer* 3.在开发时,要注解注解可以接受哪些类型,直接看注解源码即可* 4.如果是数字类型,不支持@Pattern, 后面再想办法*/@NotNull(message = "显示状态不能为空")private Integer isshow;/*** 检索首字母* 代码解读* 1. @Pattern 是使用自己写的正则表达式来校验, 非常有用*/@NotBlank(message = "检索字母不能为空")@Pattern(regexp = "^[a-zA-Z]$",message = "检索字母必须是a-z或者A-Z")private String firstLetter;/*** 排序* 代码解读* 1. @Min(value = 0) 表示 sort 这个字段最小值为 0*/@NotNull(message = "排序值不能为空")@Min(value = 0,message = "排序值要求大于等于0")private Integer sort;}

控制层BrandController

/*** @author xjz_2002*/
@RestController
@RequestMapping("commodity/brand")
public class BrandController {@Autowiredprivate BrandService brandService;/*** 保存* 代码解读* 1. @Validated 标注在 这里表示启用对 BrandEntity 字段的校验* 2. 注意: 如果不写 @Validated 即使在 BrandEntity 写了校验注解, 也不会生效* 3. BindingResult result: springboot 会将校验的结果 放入到 result* 4. 程序员可以通过 BindingResult result 取出自己关系的错误信息*/@RequestMapping("/save")public R save(@Validated @RequestBody BrandEntity brand,BindingResult result) {if (result.hasErrors()) {Map<String, String> map = new HashMap<>();//1. 获取校验的错误结果result.getFieldErrors().forEach((item) -> {//2. FieldError 获取到错误提示String message = item.getDefaultMessage();//3. 获取错误的属性的名字String field = item.getField();//4. 放入mapmap.put(field, message);});return R.error(400, "品牌表单数据不合法").put("data", map);} else { //没有校验错误,则正常入库brandService.save(brand);return R.ok();}}}

2. 统一管理@ControllerAdvice

统一管理数据异常工具类

package com.xjz.xjzliving.commodity.exception;import com.xjz.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap;
import java.util.Map;/*** @author xjz_2002* @version 1.0*//*** 代码解读* 1. @ResponseBody 都以 json 格式返回数据* 2. @ControllerAdvice* (basePackages = "com.xjz.xjzliving.commodity.controller")统一接管* com.xjz.xjzliving.commodity.controller 包下 抛出的异常*/
@Slf4j
@ResponseBody
@ControllerAdvice(basePackages = "com.xjz.xjzliving.commodity.controller")
public class XjzlivingExceptionControllerAdvice {/*** 代码解读* 1. 数据校验错误属于 MethodArgumentNotValidException* 2. 可 以 通 过 log.error(" 数 据 校 验 出 现 问 题 {} , 异 常 类 型 :* {}",e.getMessage(),e.getClass()); 得到* 3. 异常匹配的规则是先精确匹配,然后匹配范围更大的异常类型* 4. 写清楚精确匹配的异常后,我们可以更加准确的定制提示异常信息*/@ExceptionHandler(value = MethodArgumentNotValidException.class)public R handleVaildException(MethodArgumentNotValidException e) {log.error("数据校验出现问题{},异常类型:{}",e.getMessage(),e.getClass());BindingResult bindingResult = e.getBindingResult();Map<String , String> errorMap = new HashMap<>();bindingResult.getFieldErrors().forEach(fieldError -> {errorMap.put(fieldError.getField(), fieldError.getDefaultMessage());});return R.error(400,"方法参数异常").put("data",errorMap);}/*** 这里再写一个处理 Throwable 类型的异常的方法, * 没有精确匹配到的异常, 走这里*/@ExceptionHandler(value = Throwable.class)public R handleException(Throwable throwable){return R.error(40000,"系统未知错误");}
}

3. PostMan测试结果

数据校验异常
在这里插入图片描述![

其他异常
在这里插入图片描述

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

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

相关文章

编译原理之SLR(1)和语法制导的翻译

1.SLR(1)思想&#xff1a; 基于容许LR(0)规范集中有冲突的项目集&#xff0c;用向前查看一个符号的办法进行处理&#xff0c;解决冲突&#xff0c;因为只对有冲突的状态才查看一个符号&#xff0c;是一种简单的LR(1)分析法&#xff0c;用SLR(1)表示 2.SLR(1)分析的简单方法&a…

荣耀MWC发布AI使能的全场景战略

【2024年2月25日&#xff0c;巴塞罗那】荣耀在2024 MWC世界移动通信大会上正式发布了全新的AI使能的全场景战略&#xff0c;推出平台级AI赋能&#xff0c;以人为中心的跨操作系统体验和基于意图识别的全新人机交互&#xff0c;以及与全球合作伙伴合作的荣耀Magic6 Pro&#xff…

Easy-Jmeter: 性能测试平台

目录 写在开始1 系统架构2 表结构设计3 测试平台生命周期4 分布式压测5 压力机管理6 用例管理6.1 新增、编辑用例6.2 调试用例6.3 启动测试6.4 动态控量6.5 测试详情6.6 环节日志6.7 实时数据6.8 测试结果 7 测试记录7 用例分析8 系统部署8.1普通部署8.2容器化部署 写在最后 写…

CAS5.3使用JPA实现动态注册服务

cas同时支持cas协议和OAuth2协议,官方默认是通过扫描json文件的形式注册客户端服务,但是此种方式需要重启服务才能生效,此次我们将使用JPA来完美实现动态注册服务,如果不知道cas如何部署,可以擦看之前的文章 cas-client基于CAS协议客户端搭建-CSDN博客 cas-server5.3自定义密…

GPIO通用输入输出管脚

GPIO 文章目录 GPIO单片机的工作方式CPU是通过读写寄存器来控制GPIO的GPIO硬件框架 8种模式结构推挽/推挽复用输出模式开漏/开漏复用输出输入结构 单片机是如何访问寄存器的&#xff1f;GPIO输出速度 GPIO,General Purpose lnput Outpu,指的是芯片的通用输入输出管脚。 单片机的…

TLS1.2抓包解析

1.TLS1.2记录层消息解析 Transport Layer SecurityTLSv1.2 Record Layer: Handshake Protocol: Client HelloContent Type: Handshake (22)Version: TLS 1.0 (0x0301)Length: 253Content Type&#xff1a;消息类型&#xff0c;1个字节。 i 0Version&#xff1a;协议版本&…

第二代80KM高效远距离传输:100G ZR4光模块的应用与发展

随着信息时代的发展&#xff0c;数据传输的需求日益增长&#xff0c;而光模块作为数据中心和网络基础设施的关键组成部分&#xff0c;其性能和应用范围也在不断扩大。易天光通信的第二代100G ZR4 80KM光模块很好的满足了当代社会通信网络的需求。本文易天光通信将探讨第二代高效…

数学建模【插值与拟合】

一、插值与拟合简介 在数学建模过程中&#xff0c;通常要处理由试验、测量得到的大量数据或一些过于复杂而不便于计算的函数表达式&#xff0c;针对此情况&#xff0c;很自然的想法就是&#xff0c;构造一个简单的函数作为要考察数据或复杂函数的近似。插值和拟合就可以解决这…

快速启动-后台管理系统

目录 Gitee人人开源 后端快速启动 1.clone仓库到本地 2.初始化数据库 3.更改数据库连接 4.启动项目验证 前端快速启动 1.克隆仓库 2.vsCode打开 3.控制台npm install 4.验证测试 时代已然不同&#xff0c;后台管理也可以使用脚手架方式快速启动。 Gitee人人开源 地…

京东 h5st 4.1 4.2 4.3 4.4逆向算法分析、API接口、商品详情、价格API接口(2024-02-26)

一、最新京东h5st 4.4逆向 1、h5st 4.4的位置 搜索关键字h5st很快找到&#xff1a; &#xff08;h5st 4.4所在位置&#xff09; 2、签名代码如下&#xff1a; , r JSON.stringify(a), c (new Date).getTime() || "1", d {appid: "pc-item-soa",functio…

洛谷C++简单题小练习day21—梦境数数小程序

day21--梦境数数--2.25 习题概述 题目背景 Bessie 处于半梦半醒的状态。过了一会儿&#xff0c;她意识到她在数数&#xff0c;不能入睡。 题目描述 Bessie 的大脑反应灵敏&#xff0c;仿佛真实地看到了她数过的一个又一个数。她开始注意每一个数码&#xff08;0…9&#x…

短链接的背后故事:为互联网用户带来的便捷与安全

title: 短链接的背后故事&#xff1a;为互联网用户带来的便捷与安全 date: 2024/2/26 14:58:58 updated: 2024/2/26 14:58:58 tags: 短链接技术起源长URL问题解决链接分享便利性链接跟踪与分析链接管理效率提升链接安全保障应用领域广泛 一、短链接的起源 短链接是一种将长UR…

WampServer环境下载安装并结合内网穿透实现远程访问管理界面

文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 Wamp 是一个 Windows系统下的 Apache PHP Mysql 集成安装环境&#xff0c;是一组常用来…

【前端】一文学懂HTML与CSS选择器基础

文章目录 1. 前言与准备工作1.1 前言1.2 准备工作1.2.1 工具选用1.2.2 VSCode下载与配置 2. 基本概念2.1 通过HelloWorld理解HTML基本概念2.1.1 HTML是什么2.1.2 如何理解"超文本"?2.1.3 HTML基础结构2.1.3 学习第一组标签&#xff1a;段落p与标题h1~h6 2.2 CSS基础…

(202402)多智能体MetaGPT入门1:MetaGPT环境配置

文章目录 前言拉取MetaGPT仓库1 仅仅安装最新版2 拉取源码本地安装MetaGPT安装成果全流程展示 尝试简单使用1 本地部署大模型尝试&#xff08;失败-->成功&#xff09;2 讯飞星火API调用 前言 感谢datawhale组织开源的多智能体学习内容&#xff0c;飞书文档地址在https://d…

实习日志30

概要 高拍仪硬件通信原理&#xff0c;WebSocket源码解析&#xff08;JavaScript&#xff09; WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据…

DWT硬件延时

DWT硬件延时 文章目录 DWT硬件延时软件&硬件延时方案软件延时硬件延时方案 DWT硬件延时方案DWT硬件延时方案DEMCR寄存器DWT硬件延时方案实现延时初始化&#xff1a;US延时&#xff1a;MS延时&#xff1a; 软件&硬件延时方案 软件延时 static void Delay(uint32_t cou…

Leetcode刷题笔记题解(C++):6. Z 字形变换

思路&#xff1a;遍历时候需要更新步进长度 到达0行的时候步进长度为1&#xff1b;到达最后一行numRows-1行的时候步进长度为-1&#xff1b;代码如下所示&#xff1a; class Solution { public:string convert(string s, int numRows) {//如果字符串长度为1或者所给行数为1 …

vscode更新至1.86版本后,ssh远程连接服务器出现异常

问题 you are connected to an OS version that is unsupported by Visual Studio Code 你已连接到不受Visual Studio Code支持的OS 版本 原因是vscode更新到1.86版本后要求远程连接服务器的内核版本和库版本需要符合下面条件。 解决方法 因此有两种方法解决 1.更新服务器…

开源MBG----renrenGenerator

目录 1.克隆项目到本地 2.编辑数据库连接 3.定义生成的代码模版 4.验证生成结果 5.多说一句 项目简介&#xff1a;人人开源项目的代码生成器&#xff0c;可在线生成entity、xml、dao、service、vue、sql代码&#xff0c;减少70%以上的开发任务。 项目地址&#xff1a;ren…