@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.hqwc.cn/news/484618.html

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

相关文章

【复现】某尔顿 安全审计系统任意文件读取漏洞_56

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 某尔顿网络安全审计产品支持1-3线路的internet接入、1-3对网桥&#xff1b;含强大的上网行为管理、审计、监控模块&#xff1b;用…

[python pip] A new release of pip is available: 23.2.1 -> 24.0

翻译之后&#xff1a;〔通知〕新版本的pip可用&#xff1a;23.2.1->24.0 就是说&#xff0c;你的pip版本需要从当前的 23.2.1 升级到最新版本 24.0&#xff0c;执行如下命令&#xff1a; cmd命令以管理员身份进入目录 ${Python}\Python3.12.1\Scripts下&#xff0c;执行 p…

WEB-UI自动化测试实践

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Android横竖屏切换configChanges=“screenSize|orientation“避免activity销毁重建,Kotlin

Android横竖屏切换configChanges"screenSize|orientation"避免activity销毁重建&#xff0c;Kotlin 如果不在Androidmanifest.xml设置activity的&#xff1a; android:configChanges"screenSize|orientation" 那么&#xff0c;每次横竖屏切换activity都会…

大蟒蛇(Python)笔记(总结,摘要,概括)——第5章 if 语句

目录 5.1 一个简单的示例 5.2 条件测试 5.2.1 检查是否相等 5.2.2 如何在检查是否相等时忽略大小写 5.2.3 检查是否不等 5.2.4 数值比较 5.2.5 检查多个条件 5.2.6 检查特定的值是否在列表中 5.2.7 检查特定的值是否不在列表中 5.2.8 布尔表达式 5.3 if 语句 5.3.1 简单的if…

idea 打不开项目 白屏

使用IDEA打开项目&#xff0c; 不知名原因崩溃了&#xff0c; 直接出现缩略图白屏。 解决过程&#xff1a; 尝试过重启IDEA&#xff0c;重启过电脑&#xff0c;重新引入相同项目&#xff08;使用不同路径&#xff0c;存在缓存记录&#xff0c;依然打不开&#xff09;&#xff…

Java面试题之分布式/微服务篇

经济依旧不景气啊&#xff0c;如此大环境下Java还是这么卷&#xff0c;又是一年一次的金三银四。 兄弟们&#xff0c;你准备好了吗&#xff1f;冲冲冲&#xff01;欧里给&#xff01; 分布式/微服务相关面试题解 题一&#xff1a;CAP理论&#xff0c;BASE理论题二&#xff1a;…

2月22日作业,按键中断LED灯控制

1.使用GPIO子系统&#xff0c;编写LED驱动&#xff0c;应用程序测试 mychrdev.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include <linux/of.h> …

虚拟机器centos7无法识别yum 命令异常处理笔记

问题现象 启动虚拟机后执行ipconfig 提示未找到该命令,然后执行yum install -y net-tools提示 curl#6 - "Could not resolve host: mirrorlist.centos.org; 未知的错误"的错误 [roothaqdoop~]# ifconfig -bash: ifconfig: 未找到命令 [roothadoop~]# yum install …

小程序列表下拉刷新和加载更多

配置 在小程序的app.json中&#xff0c;检查window项目中是否已经加入了"enablePullDownRefresh": true&#xff0c;这个用来开启下拉刷新 "window": {"backgroundTextStyle": "light","navigationBarBackgroundColor": &q…

C#版字节跳动SDK - SKIT.FlurlHttpClient.ByteDance

前言 在我们日常开发工作中对接第三方开放平台&#xff0c;找一款封装完善且全面的SDK能够大大的简化我们的开发难度和提高工作效率。今天给大家推荐一款C#开源、功能完善的字节跳动SDK&#xff1a;SKIT.FlurlHttpClient.ByteDance。 项目官方介绍 可能是全网唯一的 C# 版字…

云原生高级第一次作业

目录 实验需求&#xff1a; 第一个实验步骤&#xff1a; openEuler 二进制方式安装MySQL 8.0.x 1.首先需要获取软件包 2.然后安装tar和xz格式可进行解压工具 3.接下来就是安装MySQL 4.配置环境变量 5.登入并修改密码 6.停止服务脚本 7.提供配置文件 8.进入/etc/my.cnf…