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

SpringBoot自定义异常

前言

在前后端开发中,后端接口返回的数据都是JSON格式的,但是后端可能会出现一些可以未知从异常,在后端抛出这些异常的时候,也需要返回相同格式的JSON数据,这时候就需要我们设置全局异常处理器。在后端开发中,需要对一些条件做判断,也可以抛出自定义的异常。话不多说,直接上代码

代码

  1. 自定义异常
/*** 业务异常*/
public final class ServiceException extends RuntimeException {private static final long serialVersionUID = 1L;/*** 错误码*/private Integer code;/*** 错误提示*/private String message;/*** 错误明细,内部调试错误* <p>* 和 {CommonResult # getDetailMessage()} 一致的设计*/private String detailMessage;/*** 空构造方法,避免反序列化问题*/public ServiceException() {}public ServiceException(String message) {this.message = message;}public ServiceException(String message, Integer code) {this.message = message;this.code = code;}public String getDetailMessage() {return detailMessage;}@Overridepublic String getMessage() {return message;}public Integer getCode() {return code;}public ServiceException setMessage(String message) {this.message = message;return this;}public ServiceException setDetailMessage(String detailMessage) {this.detailMessage = detailMessage;return this;}
}
  1. 定义全局异常处理
import com.juxin.insureclient.common.domain.AjaxResult;
import com.juxin.insureclient.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import javax.servlet.http.HttpServletRequest;/*** 全局异常处理器*/
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {/*** 请求方式不支持*/@ExceptionHandler(HttpRequestMethodNotSupportedException.class)public AjaxResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e,HttpServletRequest request){String requestURI = request.getRequestURI();log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod());return AjaxResult.error(e.getMessage());}/*** 业务异常*/@ExceptionHandler(ServiceException.class)public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request){log.error(e.getMessage(), e);Integer code = e.getCode();return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage());}/*** 拦截未知的运行时异常*/@ExceptionHandler(RuntimeException.class)public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request){String requestURI = request.getRequestURI();log.error("请求地址'{}',发生未知异常.", requestURI, e);return AjaxResult.error(e.getMessage());}/*** 系统异常*/@ExceptionHandler(Exception.class)public AjaxResult handleException(Exception e, HttpServletRequest request){String requestURI = request.getRequestURI();log.error("请求地址'{}',发生系统异常.", requestURI, e);return AjaxResult.error(e.getMessage());}
}

3.返回消息格式

import com.juxin.insureclient.common.constant.HttpStatus;
import com.juxin.insureclient.common.utils.StringUtils;import java.util.HashMap;/*** 操作消息提醒*/
public class AjaxResult extends HashMap<String, Object> {private static final long serialVersionUID = 1L;/*** 状态码*/public static final String CODE_TAG = "code";/*** 返回内容*/public static final String MSG_TAG = "msg";/*** 数据对象*/public static final String DATA_TAG = "data";/*** 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。*/public AjaxResult() {}/*** 初始化一个新创建的 AjaxResult 对象** @param code 状态码* @param msg  返回内容*/public AjaxResult(int code, String msg) {super.put(CODE_TAG, code);super.put(MSG_TAG, msg);}/*** 初始化一个新创建的 AjaxResult 对象** @param code 状态码* @param msg  返回内容* @param data 数据对象*/public AjaxResult(int code, String msg, Object data) {super.put(CODE_TAG, code);super.put(MSG_TAG, msg);if (StringUtils.isNotNull(data)) {super.put(DATA_TAG, data);}}/*** 返回成功消息** @return 成功消息*/public static AjaxResult success() {return AjaxResult.success("操作成功");}/*** 返回成功数据** @return 成功消息*/public static AjaxResult success(Object data) {return AjaxResult.success("操作成功", data);}/*** 返回成功消息** @param msg 返回内容* @return 成功消息*/public static AjaxResult success(String msg) {return AjaxResult.success(msg, null);}/*** 返回成功消息** @param msg  返回内容* @param data 数据对象* @return 成功消息*/public static AjaxResult success(String msg, Object data) {return new AjaxResult(HttpStatus.SUCCESS, msg, data);}/*** 返回警告消息** @param msg 返回内容* @return 警告消息*/public static AjaxResult warn(String msg) {return AjaxResult.warn(msg, null);}/*** 返回警告消息** @param msg  返回内容* @param data 数据对象* @return 警告消息*/public static AjaxResult warn(String msg, Object data) {return new AjaxResult(HttpStatus.WARN, msg, data);}/*** 返回错误消息** @return*/public static AjaxResult error() {return AjaxResult.error("操作失败");}/*** 返回错误消息** @param msg 返回内容* @return 警告消息*/public static AjaxResult error(String msg) {return AjaxResult.error(msg, null);}/*** 返回错误消息** @param msg  返回内容* @param data 数据对象* @return 警告消息*/public static AjaxResult error(String msg, Object data) {return new AjaxResult(HttpStatus.ERROR, msg, data);}/*** 返回错误消息** @param code 状态码* @param msg  返回内容* @return 警告消息*/public static AjaxResult error(int code, String msg) {return new AjaxResult(code, msg, null);}/*** 链式调用** @param key   键* @param value 内容* @return 警告消息*/@Overridepublic AjaxResult put(String key, Object value) {super.put(key, value);return this;}
}

相关文章:

SpringBoot自定义异常

前言 在前后端开发中&#xff0c;后端接口返回的数据都是JSON格式的&#xff0c;但是后端可能会出现一些可以未知从异常&#xff0c;在后端抛出这些异常的时候&#xff0c;也需要返回相同格式的JSON数据&#xff0c;这时候就需要我们设置全局异常处理器。在后端开发中&#xf…...

华为源NAT技术与目的NAT技术

1&#xff09;源NAT对报文源地址进行转换&#xff0c;分为NAT NO-PAT&#xff0c;NAPT,EASY-IP,三元组NAT&#xff1b; &#xff08;1&#xff09;NAT NO-PAT原理&#xff1a; no-port address translation:非端口地址转换&#xff1a;只转换地址&#xff0c;不转换端口&…...

人工智能与机器学习原理精解【25】

文章目录 正则化概述一、正则化的种类二、正则化的定义三、正则化的计算四、正则化的性质五、正则化的例子 公式与计算一、正则化的种类Dropout正则化一、基本思想二、实现方法三、作用机制四、使用注意事项五、总结Dropout正则化的例子和公式。一、Dropout正则化的例子二、Dro…...

一篇文章讲清楚synchronized关键字的作用及原理

概述 在应用Sychronized关键字时需要把握如下注意点&#xff1a; 一把锁只能同时被一个线程获取&#xff0c;没有获得锁的线程只能等待&#xff1b; 每个实例都对应有自己的一把锁(this),不同实例之间互不影响&#xff1b;例外&#xff1a;锁对象是*.class以及synchronized修…...

深度学习模型之BERT的24个小模型源码与预训练紧凑模型的重要性

原始信息 论文&#xff1a; Well-Read Students Learn Better: On the Importance of Pre-training Compact Models作者&#xff1a;Iulia Turc, Ming-Wei Chang, Kenton Lee, Kristina Toutanova地址&#xff1a;arxiv.org/pdf/1908.08…中文&#xff1a;阅读良好的学生学得更…...

【HarmonyOS】深入理解@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化

【HarmonyOS】深入理解Observed装饰器和ObjectLink装饰器&#xff1a;嵌套类对象属性变化 前言 之前就Observed和ObjectLink写过一篇讲解博客【HarmonyOS】 多层嵌套对象通过ObjectLink和Observed实现渲染更新处理&#xff01; 其中就Observe监听类的使用&#xff0c;Object…...

Java笔试面试题AI答之设计模式(1)

文章目录 1. 简述什么是设计模式 &#xff1f;2. 叙述常见Java设计模式分类 &#xff1f;3. Java 设计模式的六大原则 &#xff1f;4. 简述对 MVC 的理解&#xff0c; MVC 有什么优缺点&#xff1f;MVC 的三个核心部分&#xff1a;MVC 的优点&#xff1a;MVC 的缺点&#xff1a…...

java调用opencv部署到centos7

1、官网下载opencv https://opencv.org/releases/ 2、下载opencv并解压 unzip opencv-3.4.7.zip cd opencv-3.4.7 mkdir build cd build/ 3、安装cmake yum remove cmake -y ; yum install -y gcc gcc-c make automake openssl openssl-devel wget https://cmake.org/files/…...

【python qdrant 向量数据库 完整示例代码】

测试一下python版本的dqrant向量数据库的效果&#xff0c;完整代码如下&#xff1a; 安装库 !pip install qdrant-client>1.1.1 !pip install -U sentence-transformers导入 from qdrant_client import models, QdrantClient from sentence_transformers import SentenceT…...

初识C语言(三)

感兴趣的朋友们可以留个关注&#xff0c;我们共同交流&#xff0c;相互促进学习。 文章目录 前言 八、函数 九、数组 &#xff08;1&#xff09;数组的定义 &#xff08;2&#xff09;数组的下标和使用 十、操作符 &#xff08;1&#xff09;算数操作符 &#xff08;2&#xff…...

用通义灵码如何快速合理解决遗留代码问题?

本文首先介绍了遗留代码的概念&#xff0c;并对遗留代码进行了分类。针对不同类型的遗留代码&#xff0c;提供了相应的处理策略。此外&#xff0c;本文重点介绍了通义灵码在维护遗留代码过程中能提供哪些支持。 什么是遗留代码 与过时技术相关的代码&#xff1a; 与不再受支持的…...

新书推荐——《Python贝叶斯深度学习》

在过去的十年中&#xff0c;机器学习领域取得了长足的进步&#xff0c;并因此激发了公众的想象力。但我们必须记住&#xff0c;尽管这些算法令人印象深刻&#xff0c;但它们并非完美无缺。本书旨在通过平实的语言介绍如何在深度学习中利用贝叶斯推理&#xff0c;帮助读者掌握开…...

数据结构-3.1.栈的基本概念

一.栈的定义&#xff1a; 栈和线性表的区别&#xff1a;栈只能在表尾一端进行插入或者删除的操作&#xff0c;而线性表可以在任意一个地方进行插入或者删除 二.有关栈的关键术语&#xff1a; 三.栈的基本操作&#xff1a; 1.回顾线性表的基本操作&#xff1a; 2.栈的基本操作&…...

关于 NLP 应用方向与深度训练的核心流程

文章目录 主流应用方向核心流程&#xff08;5步&#xff09;1.选定语言模型结构2.收集标注数据3.forward 正向传播4.backward 反向传播5.使用模型预测真实场景 主流应用方向 文本分类文本匹配序列标注生成式任务 核心流程&#xff08;5步&#xff09; 基本流程实现的先后顺序…...

linux如何启用ipv6随机地址

简介 在 IPv6 中&#xff0c;临时随机地址&#xff08;Temporary IPv6 Address&#xff09;是一种为了提高隐私和安全而设计的功能。通常&#xff0c;默认的 IPv6 地址是基于设备的 MAC 地址生成的&#xff0c;容易导致跟踪和识别设备。启用临时 IPv6 地址可以避免这个问题&am…...

探索 Android DataBinding:实现数据与视图的完美融合

在 Android 开发中&#xff0c;数据与视图的交互一直是一个关键的问题。为了更好地实现数据的展示和更新&#xff0c;Google 推出了 DataBinding 库&#xff0c;它为开发者提供了一种简洁、高效的方式来处理数据与视图之间的绑定关系&#xff0c;大大提高了开发效率和代码的可读…...

Java 编码系列:线程基础与最佳实践

引言 在多任务处理和并发编程中&#xff0c;线程是不可或缺的一部分。Java 提供了丰富的线程管理和并发控制机制&#xff0c;使得开发者可以轻松地实现多线程应用。本文将深入探讨 Java 线程的基础知识&#xff0c;包括 Thread 类、Runnable 接口、Callable 接口以及线程的生命…...

《深度学习》—— ResNet 残差神经网络

文章目录 一、什么是ResNet&#xff1f;二、残差结构&#xff08;Residual Structure&#xff09;三、Batch Normalization&#xff08;BN----批归一化&#xff09; 一、什么是ResNet&#xff1f; ResNet 网络是在 2015年 由微软实验室中的何凯明等几位大神提出&#xff0c;斩获…...

针对考研的C语言学习(定制化快速掌握重点3)

1.数组常见错误 数组传参实际传递的是数组的起始地址&#xff0c;若在函数中改变数组内容&#xff0c;数组本身也会发生变化 #include<stdio.h> void change_ch(char* str) {str[0] H; } int main() {char ch[] "hello";change_ch(ch);printf("%s\n&q…...

pikachu XXE(XML外部实体注入)通关

靶场&#xff1a;pikachu 环境: 系统&#xff1a;Windows10 服务器&#xff1a;PHPstudy2018 靶场&#xff1a;pikachu 关卡提示说&#xff1a;这是一个接收xml数据的api 常用的Payload 回显 <?xml version"1.0"?> <!DOCTYPE foo [ <!ENTITY …...

湿版摄影风格失效的5个致命误区,第4个连Midjourney官方文档都未披露——基于217组AB测试的权威归因报告

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;湿版摄影风格失效的5个致命误区&#xff0c;第4个连Midjourney官方文档都未披露——基于217组AB测试的权威归因报告 为何“wet plate collodion”提示词突然失灵&#xff1f; 在 Midjourney v6.1 及 N…...

RML2016.10a数据集读取避坑指南:用Python pickle解决‘latin-1’编码报错

RML2016.10a数据集读取避坑指南&#xff1a;用Python pickle解决‘latin-1’编码报错 当你第一次拿到RML2016.10a数据集&#xff0c;满心欢喜准备开始实验时&#xff0c;一个简单的.pkl文件读取操作却可能让你陷入编码错误的泥潭。UnicodeDecodeError: utf-8 codec cant decode…...

自学 Vibe Coding 这三个网站就够了!

背景 我之前想学 Vibe Coding&#xff0c;刷到各种"AI 编程神器"、"零基础用 AI 写代码"的文章&#xff0c;看得心潮澎湃。 结果一上手就懵了&#xff1a;装了插件、开了 AI、对着编辑器发呆&#xff0c;不知道下一步干嘛。 网上搜教程&#xff0c;要么…...

告别循环中的Thread.sleep():从IDEA告警到高效定时任务的最佳实践

1. 为什么Thread.sleep()在循环中是个危险信号&#xff1f; 第一次在IDEA里看到"Call to Thread.sleep() in a loop, probably busy-waiting"这个黄色警告时&#xff0c;我和大多数开发者一样不以为然——毕竟这个写法在教科书和早期项目中太常见了。直到有次我们的A…...

测试驱动开发与持续集成实践指南

测试驱动开发与持续集成实践指南 引言 测试驱动开发&#xff08;TDD&#xff09;和持续集成&#xff08;CI&#xff09;是现代软件开发中的重要实践。TDD强调先写测试再实现功能&#xff0c;CI确保代码的持续质量和快速反馈。本文将深入探讨TDD的方法论和CI的实践经验。 一、测…...

Filecoin挖矿硬件怎么选?用Lotus-bench实测RTX 2080 Ti到GTX 1060的密封性能

Filecoin挖矿硬件实战指南&#xff1a;从GPU选型到Lotus-bench深度优化 在Filecoin挖矿生态中&#xff0c;GPU性能直接决定了密封效率和区块奖励获取能力。面对市场上从高端RTX 2080 Ti到入门级GTX 1060的各类显卡&#xff0c;矿工往往陷入选择困境——官方推荐列表中的参数是否…...

从真空袋到回流焊:一份给硬件创业团队的元器件储存与使用避坑指南

从真空袋到回流焊&#xff1a;硬件创业团队的元器件储存与使用避坑指南 当你拆开一包全新的芯片&#xff0c;是否曾想过这些看似坚固的小方块其实对环境湿度极其敏感&#xff1f;对于资源有限的硬件创业团队来说&#xff0c;正确处理MSL&#xff08;湿度敏感等级&#xff09;元…...

Chrome QRCode插件终极指南:如何在3分钟内实现跨设备无缝内容同步

Chrome QRCode插件终极指南&#xff1a;如何在3分钟内实现跨设备无缝内容同步 【免费下载链接】chrome-qrcode :zap: A Chrome plugin to Genrate QRCode of URL / Text, or Decode the QRcode in website. 一个Chrome浏览器插件&#xff0c;用于生成当前URL或者选中内容的二维…...

taotoken如何为ubuntu上的ai应用提供稳定多模型api支持

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 taotoken如何为ubuntu上的ai应用提供稳定多模型api支持 在Ubuntu服务器上部署和运行AI应用&#xff0c;是许多开发团队的标准实践。…...

鸿蒙与Kotlin跨平台开发中的性能与功耗深度优化实践

摘要:本文聚焦KMP(Kotlin Multiplatform)与鸿蒙(ArkTS)集成开发中的性能与功耗优化,结合架构设计、系统级调优及实战案例,提供可落地的解决方案。全文涵盖核心优化领域:内存管理、渲染管线、跨进程通信、功耗模型分析等,适用于中大型项目迁移与重构。 一、KMP跨平台模…...