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

SpringMVC+统一表现层返回值+异常处理器

一、统一表现层返回值

  根据我们不同的处理方法,返回的数据格式都会不同,例如添加只返回true|false,删除同理,而查询却返回数据。

Result类

为此我们封装一个result类来用于表现层的返回。

public class Result {//描述统一格式中的数据private Object data;//描述统一格式中的编码,用于区分操作,可以简化配置0或1表示成功失败private Integer code;//描述统一格式中的消息,可选属性private String msg;public Result() {}public Result(Integer code,Object data) {this.data = data;this.code = code;}public Result(Integer code, Object data, String msg) {this.data = data;this.code = code;this.msg = msg;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}
}

Code类

Code类不是固定的,是商量好的一种编号,每种编号对应业务操作的不同状态。

public class Code {//Code类的常量设计也不是固定的,可以根据需要自行增减。public static final Integer SAVE_OK = 20011;public static final Integer DELETE_OK = 20021;public static final Integer UPDATE_OK = 20031;public static final Integer GET_OK = 20041;public static final Integer SAVE_ERR = 20010;public static final Integer DELETE_ERR = 20020;public static final Integer UPDATE_ERR = 20030;public static final Integer GET_ERR = 20040;
}

 BookController类

//统一每一个控制器方法返回值
@RestController
@RequestMapping("/books")
public class BookController {@Autowiredprivate BookService bookService;@PostMappingpublic Result save(@RequestBody Book book) {boolean flag = bookService.save(book);return new Result(flag ? Code.SAVE_OK:Code.SAVE_ERR,flag);}@PutMappingpublic Result update(@RequestBody Book book) {boolean flag = bookService.update(book);return new Result(flag ? Code.UPDATE_OK:Code.UPDATE_ERR,flag);}@DeleteMapping("/{id}")public Result delete(@PathVariable Integer id) {boolean flag = bookService.delete(id);return new Result(flag ? Code.DELETE_OK:Code.DELETE_ERR,flag);}@GetMapping("/{id}")public Result getById(@PathVariable Integer id) {Book book = bookService.getById(id);Integer code = book != null ? Code.GET_OK : Code.GET_ERR;String msg = book != null ? "" : "数据查询失败,请重试!";return new Result(code,book,msg);}@GetMappingpublic Result getAll() {List<Book> bookList = bookService.getAll();Integer code = bookList != null ? Code.GET_OK : Code.GET_ERR;String msg = bookList != null ? "" : "数据查询失败,请重试!";return new Result(code,bookList,msg);}
}

对应效果

二、异常处理

  对于Dao层(数据层),Service层(服务层),Controller(业务控制层)等,所抛出的异常应该统一到业务控制层来处理。

1.封装异常处理器类

@RestControllerAdvice注解可以声明一个类为异常处理器类

@ExceptionHandler注解是定义当前方法用于处理哪一种异常,通过形参可以把异常传进来

 

 

2. 项目中的异常

  自定义异常都要继承RuntimeException这个类,这个类的父类是Exception,这个类是运行异常类,碰到了自动往业务层传递异常。

BusinessException 自定义业务异常类

//自定义异常处理器,用于封装异常信息,对异常进行分类
public class BusinessException extends RuntimeException{private Integer code;public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}
//自动实现的构造方法有很多,只不过这两种实用public BusinessException(Integer code, String message) {super(message);this.code = code;}public BusinessException(Integer code, String message, Throwable cause) {super(message, cause);this.code = code;}
}

 SystemException 自定义系统异常类

//自定义异常处理器,用于封装异常信息,对异常进行分类
public class SystemException extends RuntimeException{private Integer code;public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public SystemException(Integer code, String message) {super(message);this.code = code;}public SystemException(Integer code, String message, Throwable cause) {super(message, cause);this.code = code;}}

Code类的补充

public static final Integer SYSTEM_ERR = 50001;public static final Integer SYSTEM_TIMEOUT_ERR = 50002;public static final Integer SYSTEM_UNKNOW_ERR = 59999;public static final Integer BUSINESS_ERR = 60002;

 异常控制类-ProjectExceptionAdvice

拦截并处理异常

//@RestControllerAdvice用于标识当前类为REST风格对应的异常处理器
@RestControllerAdvice
public class ProjectExceptionAdvice {//@ExceptionHandler用于设置当前处理器类对应的异常类型@ExceptionHandler(SystemException.class)public Result doSystemException(SystemException ex){//记录日志//发送消息给运维//发送邮件给开发人员,ex对象发送给开发人员return new Result(ex.getCode(),null,ex.getMessage()); //规范返回结果}@ExceptionHandler(BusinessException.class)public Result doBusinessException(BusinessException ex){return new Result(ex.getCode(),null,ex.getMessage());}//除了自定义的异常处理器,保留对Exception类型的异常处理,用于处理非预期的异常@ExceptionHandler(Exception.class)public Result doOtherException(Exception ex){//记录日志//发送消息给运维//发送邮件给开发人员,ex对象发送给开发人员return new Result(Code.SYSTEM_UNKNOW_ERR,null,"系统繁忙,请稍后再试!");}
}

相关文章:

SpringMVC+统一表现层返回值+异常处理器

一、统一表现层返回值 根据我们不同的处理方法&#xff0c;返回的数据格式都会不同&#xff0c;例如添加只返回true|false&#xff0c;删除同理&#xff0c;而查询却返回数据。 Result类 为此我们封装一个result类来用于表现层的返回。 public class Result {//描述统一格式…...

2023年地理信息系统与遥感专业就业前景与升学高校排名选择

活动地址&#xff1a;毕业季进击的技术er 地理信息系统&#xff08;GIS&#xff0c;Geographic Information System&#xff09;&#xff0c;又称“地理信息科学”&#xff08;Geographic Information Science&#xff09;&#xff0c;是一种具有信息系统空间专业形式的数据管理…...

第五章:最新版零基础学习 PYTHON 教程—Python 字符串操作指南(第二节 - Python 字符串—Python 字符串 len()的语法)

Python len() 函数返回字符串的长度。 目录 Python len() 语法 Python len() 示例 示例 1:带有元组和字符串的 Len() 函数...

ubuntu22.04使用共享文件设置

从ubuntu20.04开始&#xff0c;设置共享文件就很麻烦 第一步&#xff1a; 安装samba&#xff1a; sudo apt install samba第二步; 创建一个共享文件夹 我以桌面Desktop为例子 第三步&#xff1a; 设置密码&#xff1a; sudo smbpasswd -a ygc第四步&#xff1a; sudo vim …...

pycharm配置python3.8版本专门用于undecteded_chromedriver测试

pycharm配置python3.8版本专门用于undecteded_chromedriver测试 作者&#xff1a;虚坏叔叔 博客&#xff1a;https://pay.xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 一、Pycharm及python环境的配置 1.安装python-3.8.7rc1-amd64.e…...

基于SpringBoot的民宿在线预定平台

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 民宿信息管理 民宿资讯管理 民宿分类管理 用户注册 民宿信息 我的订单 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实…...

CTFHUB SSRF

目录 web351 ​编辑 web352 web353 web354 sudo.cc 代表 127 web355 host长度 web356 web357 DNS 重定向 web358 bypass web359 mysql ssrf web360 web351 POST查看 flag.php即可 web352 <?php error_reporting(0); highlight_file(__FILE__); $url$_…...

FreeRTOS入门教程(队列详细使用示例)

文章目录 前言一、队列基本使用二、如何分辨数据源三、传输大块数据总结 前言 上篇文章我们已经讲解了队列的概念和队列相关的API函数&#xff0c;那么本篇文章的话就开始带大家来学习使用队列。 一、队列基本使用 这个例子将会创建三个任务&#xff0c;其中两个任务用来发送…...

【Kafka专题】Kafka收发消息核心参数详解

目录 前置知识课程内容一、从基础的客户端说起&#xff08;Java代码集成使用&#xff09;1.1 消息发送者源码示例1.2 消息消费者源码示例1.3 客户端使用小总结 *二、从客户端属性来梳理客户端工作机制*2.1 消费者分组消费机制2.2 生产者拦截器机制2.3 消息序列化机制2.4 消息分…...

matlab 使用激光雷达检测、分类和跟踪车辆

目录 1、算法概述2、加载数据3、地平面分割4、语义分割5、聚类和边界盒拟合6、可视化设置7、循环遍历数据8、面向跟踪的包围盒9、 总结10、 支持功能11、 参考</...

代码随想录训练营二刷第四十八天 | 139.单词拆分 背包问题总结

代码随想录训练营二刷第四十八天 | 139.单词拆分 背包问题总结 一、139.单词拆分 题目链接&#xff1a;https://leetcode.cn/problems/word-break/ 思路&#xff1a;单词拼字符串&#xff0c;完全背包。定义dp[i]&#xff0c;为true表示可以拆分为一或多个单词。可能会出现ab…...

【数据挖掘】2017年 Quiz 1-3 整理 带答案

目录 Quiz 1Quiz 2Quiz 3Quiz 1 Answer Problems 1-2 based on the following training set, where A , B , C A, B, C A,B,</...

吃鸡高手必备工具大揭秘!提高战斗力,分享干货,一站满足!

大家好&#xff01;你是否想提高吃鸡游戏的战斗力&#xff0c;分享顶级的游戏作战干货&#xff0c;方便进行吃鸡作图和查询装备皮肤库存&#xff1f;是否也担心被骗&#xff0c;希望查询游戏账号是否在黑名单上&#xff0c;或者查询失信人和VAC封禁情况&#xff1f;在这段视频中…...

集群化环境前置准备

目录 部署 1. 配置多台Linux虚拟机 1.1 首先&#xff0c;关机当前CentOS系统虚拟机&#xff08;可以使用root用户执行init 0来快速关 机&#xff09; 1.2 新建文件夹 1.3 克隆 1.4 同样的操作克隆出&#xff1a;node2和node3 1.5 开启node1&#xff0c;修改主机名为node1&…...

nodejs开发环境搭建

Nodejs是一个开源的、跨平台JavaScript运行时环境&#xff0c;其使用V8引擎对JavaScript脚本执行解释&#xff0c;在前后端分离的应用架构设计中&#xff0c;其既能支持web页面服务应用的开发、也能支持后端接口服务应用的开发&#xff0c;类似于Java语言的J2EE运行时环境&…...

C语言qsort函数

排序qsort int int cmp(const void *a, const void *b) {return *(int *)a - *(int *)b;//先强转成int型&#xff0c;后解引用取值比较大小 }字符串数组 char a[] “hello world” //字符串数组&#xff0c;存放的是字符 int cmp(const void *a, const void *b) {return *(…...

如何使用 Hotshot 通过文字生成 GIF 动画

Hotshot 是一个基于人工智能的工具&#xff0c;可用于通过文字生成 GIF 动画。该工具使用最新的图像生成技术来创建逼真的动画&#xff0c;即使是复杂的文字描述也能做到。 hotshot访问地址 使用 Hotshot 生成 GIF 动画 要使用 Hotshot 生成 GIF 动画&#xff0c;您需要首先…...

吃鸡高手必备!这些技巧帮你提高战斗力!

大家好&#xff01;作为一名吃鸡玩家&#xff0c;我们都想提高自己的战斗力&#xff0c;享受顶级游戏作战干货&#xff0c;装备皮肤库存展示和查询&#xff0c;并避免被骗游戏账号。在这里&#xff0c;我将为大家介绍一些实用的技巧和工具&#xff0c;让你成为吃鸡高手&#xf…...

XV6 操作系统实验

环境搭建 ubuntu 新建一个文件setup.sh&#xff0c;内容如下 #获取工具链 git clone --recursive https://github.com/riscv/riscv-gnu-toolchain #安装必要依赖 sudo apt-get update sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev li…...

leetcode - 双周赛114

一&#xff0c;2869.收集元素的最小操作次数 // 解法&#xff1a;哈希表 从右往左遍历 class Solution {public int minOperations(List<Integer> nums, int k) {Set<Integer> set new HashSet<>();for(int i1; i<k; i){set.add(i);}for(int inums.size…...

AgenticTime:为AI智能体设计的时间推理引擎与.atime文件格式详解

1. 项目概述&#xff1a;为AI智能体赋予时间感知能力如果你用过Claude、GPT或者任何基于大语言模型的AI助手&#xff0c;肯定遇到过这样的场景&#xff1a;你告诉它“周五前要完成API评审”&#xff0c;它当时答应得好好的&#xff0c;但当你隔天再问“我这周有什么要紧事”时&…...

基于LLM与OpenClaw的智能自动化:构建自然语言驱动的桌面脚本生成器

1. 项目概述&#xff1a;连接两个世界的桥梁最近在折腾一个挺有意思的项目&#xff0c;叫hermes-openclaw-bridge。光看这个名字&#xff0c;可能有点摸不着头脑&#xff0c;但如果你同时关注过大型语言模型&#xff08;LLM&#xff09;和自动化脚本工具&#xff0c;大概就能猜…...

AI编程助手Code-Buddy:本地优先、插件化架构与工程实践全解析

1. 项目概述&#xff1a;一个为开发者量身打造的智能代码伙伴 最近在逛GitHub的时候&#xff0c;发现了一个挺有意思的项目&#xff0c;叫 runkids/code-buddy 。光看名字&#xff0c;“代码伙伴”&#xff0c;就让人感觉这应该是个能帮我们写代码、解决开发问题的工具。点进…...

抖音去水印免费版哪个好用?2026实测推荐与软件对比

抖音去水印免费版哪个好用&#xff1f;2026实测推荐与软件对比 刷到一条有意思的视频想保存下来发给朋友&#xff0c;下载后却发现左上角顶着一串"用户名"水印&#xff1b;好不容易找到一段适合做素材的内容&#xff0c;画面边缘那行字怎么裁都裁不干净。这几乎是每个…...

Origin 9 绘图避坑指南:7个高频问题解决,让你的科研图表一次成型

Origin 9 科研绘图实战&#xff1a;7个高频问题深度解析与优化方案 科研绘图是数据可视化的重要环节&#xff0c;而Origin 9作为经典的科学绘图软件&#xff0c;其功能强大但操作细节繁多。许多用户在初次接触或日常使用中常会遇到各种棘手问题&#xff0c;导致绘图效率低下、图…...

软件测试十年老兵自述:从月薪3K到年薪50W的跃迁密码

一个Bug改变的人生轨迹十年前的那个下午&#xff0c;我还记得格外清晰。作为某外包公司的“点点点”工程师&#xff0c;我机械地对着一个后台管理系统重复着测试用例。月薪3000&#xff0c;坐标二线城市&#xff0c;每天的工作就是执行别人写好的用例&#xff0c;发现Bug就提交…...

工程师如何从错误中学习:测试测量实战与思维跃迁

1. 项目概述&#xff1a;为什么“错误”是工程师的必修课在测试测量这个行当里摸爬滚打了十几年&#xff0c;我经手过的示波器、信号源、数据采集卡不计其数&#xff0c;也带过不少刚入行的新人。我发现一个挺有意思的现象&#xff1a;学校里成绩拔尖、理论扎实的学生&#xff…...

企业级Angular微前端架构中,Claude如何安全介入模块拆分与契约校验(含TS类型推导审计日志)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;企业级Angular微前端架构中Claude介入的边界与安全基线 在企业级 Angular 微前端系统中&#xff0c;将 Claude 类大语言模型&#xff08;LLM&#xff09;作为辅助开发工具引入时&#xff0c;必须严格界…...

HTML函数工具在NAS设备上能运行吗_轻服务器适配指南【指南】

在NAS上运行HTML函数工具需依场景选择方案&#xff1a;一、用Web服务托管为静态页&#xff0c;由浏览器执行&#xff1b;二、用Docker运行Node.js容器提供API&#xff1b;三、通过SSHjsdom在终端模拟执行&#xff1b;四、前端留NAS&#xff0c;后端逻辑迁至云函数。如果您希望在…...

簧片继电器可靠性设计与关键技术解析

1. Reed Relay可靠性设计的关键技术解析簧片继电器&#xff08;Reed Relay&#xff09;作为电子系统中的关键切换元件&#xff0c;其可靠性直接影响整个设备的长期稳定性。与传统电磁继电器相比&#xff0c;簧片继电器具有独特的结构优势和技术特点。本文将深入剖析提升簧片继电…...