全栈项目-乐优商场-通用工具服务-通用异常处理
全栈项目-乐优商场-通用工具服务-通用异常处理
目录
文章目录
- 1、 场景预设
- 1.1、场景
- 1.2、代码
- 1.3、启动测试‘ly-item-service'模块
- 2、错误处理改进
- 2.1、发生错误,我们直接返回异常
- 2.2、\@ControllerAdvice改进
- 2.3、自定义异常类
- ***后记*** :
内容
项目中出现异常在所难免,那么出现异常后怎么处理呢?
1、 场景预设
1.1、场景
假如我们做新增商品,需要接收下面的参数:
price: 价格
name: 名称
对数据做简单校验:
价格不能为空
新增时,自动形成ID,然后随商品对象一起返回
1.2、代码
实体类:在’ly-item-interface’模块中下java/com/leyou/item/pojo包下新建Item类
package com.leyou.item.pojo;import lombok.Data;@Datapublic class Item {private Integer id;private String name;private Integer price;}
service层:’ly-item-service’模块,java/com/leyou/item/service/ItemService
package com.leyou.item.service;import com.leyou.item.pojo.Item;import org.springframework.stereotype.Service;import java.util.Random;@Servicepublic class ItemService {public Item saveItem(Item item) {int id = new Random().nextInt(100);item.setId(id);return item;}
web层: ’ly-item-service’模块,java/com/leyou/item/web/ItemController
package com.leyou.item.web;import com.leyou.item.pojo.Item;import com.leyou.item.service.ItemService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("item")public class ItemController {@Autowiredprivate ItemService itemService;@PostMappingpublic ResponseEntity<Item> saveItem(Item item) {// 校验价格if (item.getPrice() == null) {return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);}Item item1 = itemService.saveItem(item);return ResponseEntity.status(HttpStatus.CREATED).body(item1);}}
1.3、启动测试‘ly-item-service’模块
使用前后端交互测试工具,insomnia或者postman。这里我们用postman,发送正常测试数据,返回结果,如图:
发送错误测试数据,结果:
有逻辑错误,但是没有错误提示,显然很不友好,下面我们开始做改进
2、错误处理改进
2.1、发生错误,我们直接返回异常
其他不变,修改ItemController类saveItem方法如下:
public ResponseEntity<Item> saveItem(Item item) {// 校验价格if (item.getPrice() == null) {throw new RuntimeException("价格不能为空");}Item item1 = itemService.saveItem(item);return ResponseEntity.status(HttpStatus.CREATED).body(item1);}
在此发送错误数据,postman返回数据:
{"timestamp": "2020-08-04T08:22:43.966+00:00","status": 500,"error": "Internal Server Error","message": "","path": "/item"
}
显示服务器内部错误,这显然有误导,只是参数传递错误。
2.2、@ControllerAdvice改进
- @ControllerAdvice注解会拦截所有带@Controller的返回
- @ExecptionHandler 会拦截异常
- @ExceptionHandler(异常类字节码)拦截指定类型的异常
在’ly-common’模块 java/com/leyou/common/advice 新建CommonExceptionHandler类,用来拦截处理异常,代码如下:
package com.leyou.common.advice;import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;@ControllerAdvice
public class CommonExceptionHandler {@ExceptionHandler(RuntimeException.class)public ResponseEntity<String> handleException(RuntimeException e) {return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());}
}
‘ly-item-service’ pom.xml 添加ly-common依赖,如下:
<dependency><groupId>com.leyou.common</groupId><artifactId>ly-common</artifactId><version>1.0.0-SNAPSHOT</version>
</dependency>
重新加载工程,重启服务,重新发送错误测试,返回结果:
价格不能为空
这样的话,提示过于简单,继续改进
2.3、自定义异常类
一下类都在’ly-common’模块下 java/com/leyou/common包下创建
LyException.java ,自定义异常类 exception包下,代码如下:
package com.leyou.common.exception;import com.leyou.common.enums.ExceptionEnum;import lombok.AllArgsConstructor;import lombok.Getter;import lombok.NoArgsConstructor;@NoArgsConstructor@AllArgsConstructor@Getterpublic class LyException extends RuntimeException {private ExceptionEnum exceptionEnum;}
ExceptionEnum,异常枚举 enums包下,代码如下:
package com.leyou.common.enums;import lombok.AllArgsConstructor;import lombok.Getter;import lombok.NoArgsConstructor;@NoArgsConstructor@AllArgsConstructor@Getterpublic enum ExceptionEnum {PRICE_NOTNULL(400, "价格不能为空!");private int code;private String msg;}
ExceptionResult,异常结果类,封装异常结果,vo包下,代码如下:
package com.leyou.common.vo;import com.leyou.common.enums.ExceptionEnum;import lombok.Data;@Datapublic class ExceptionResult {private int status;private String message;private long timestamp;public ExceptionResult(ExceptionEnum e) {this.status = e.getCode();this.message = e.getMsg();this.timestamp = System.currentTimeMillis();}}
整体包结构如图:
重新reiport工程,重新运行’ly-item-service’模块,如果报错就重新install下’leyou‘一级工程,重新发送错误数据,返回结果图示:
到此通用异常处理结束,如果有新的逻辑异常,比如注册用户名不能重复,只需在ExceptionEnum内添加,然后使用即可。
后记 :
本项目为参考某马视频开发,相关视频及配套资料可自行度娘或者联系本人。上面为自己编写的开发文档,持续更新。欢迎交流,本人QQ:806797785
前端项目源代码地址:https://gitee.com/gaogzhen/ly-bms // 前端后台管理系统
后端JAVA源代码地址:https://gitee.com/gaogzhen/ly-backend // 后端项目
全栈项目-乐优商场-通用工具服务-通用异常处理相关推荐
- 王者荣耀全栈项目部署到阿里云服务器笔记
王者荣耀全栈项目部署到阿里云服务器笔记 原创Charles_GX 最后发布于2020-03-27 01:27:00 阅读数 177 收藏 展开 王者荣耀全栈项目部署到阿里云服务器笔记 学习的项目来自 ...
- vue商城项目源码_CMS全栈项目之Vue和React篇(下)(含源码)
今天给大家介绍的主要是我们全栈CMS系统的未讲解完的后台部分和前台部分,如果对项目背景和技术栈不太了解,可以查看我之前的文章 基于nodeJS从0到1实现一个CMS全栈项目(上) 基于nodeJS从0 ...
- 一个nuxt(vue)+mongoose全栈项目聊聊我粗浅的项目架构
这是一篇求职文章 年龄21 坐标成都 找一份vue.js移动端H5工作 一份没有任何包装纯真实的简历 简历戳这 求职文章一共有两篇 另外一篇请点击一个基于Vue+TypeScript的[移动端]Vue ...
- Vue、Node全栈项目~面向小白的博客系统~
个人博客系统 前言 ❝ 代码质量问题轻点喷(去年才学的前端),有啥建议欢迎联系我,联系方式见最下方,感谢! 页面有啥bug也可以反馈给我,感谢! 这是一套包含前后端代码的个人博客系统,欢迎各位提出建议 ...
- 面试超尴尬瞬间:我从没参与过一个全栈项目
写简历是找工作的第一步,第二步就是面试,那么简历就是一块敲开面试大门的敲门砖,所以写简历的根本目的就是要体现出你的专业水平和项目经验,那么什么样的简历能够快速的抓住HR的眼球呢?作为前端工程师的简历来 ...
- 0217前端日报:2020前端实践|优雅的实现一个全栈项目
给 「前端开发博客」 加星标,每天打卡学习 长按二维码即可识别"进入网页"查看哟~ 1.2020前端实践|优雅的实现一个全栈项目(一) vweb_visual是一个简单的后台管理项 ...
- 【javaWeb微服务架构项目——乐优商城day15】——会调用订单系统接口,实现订单结算功能,实现微信支付功能
0.学习目标 会调用订单系统接口 实现订单结算功能 实现微信支付功能 源码笔记及资料: 链接:https://pan.baidu.com/s/1_opfL63P1pzH3rzLnbFiNw 提取码:v ...
- Vue、Nuxt服务端渲染,NodeJS全栈项目,面试小白的博客系统~~
Holle,大家好,我是李白!! 一时兴起的开源项目,到这儿就告一段落了. 这是一个入门全栈之路的小项目,从设计.前端.后端.服务端,一路狂飙的学习,发量正在欣喜若狂~~ 接触过WordPress,H ...
- 【javaWeb微服务架构项目——乐优商城day03】——(搭建后台管理前端,Vuetify框架,使用域名访问本地项目,实现商品分类查询,cors解决跨域,品牌的查询)
乐优商城day03 0.学习目标 1.搭建后台管理前端 1.1.导入已有资源 1.2.安装依赖 1.3.运行一下看看 1.4.目录结构 1.5.调用关系 2.Vuetify框架 2.1.为什么要学习U ...
- 【javaWeb微服务架构项目——乐优商城day05】——商品规格参数管理(增、删、改,查已完成),SPU和SKU数据结构,商品查询
乐优商城day05 0.学习目标 1.商品规格数据结构 1.1.SPU和SKU 1.2.数据库设计分析 1.2.1.思考并发现问题 1.2.2.分析规格参数 1.2.3.SKU的特有属性 1.2.4. ...
最新文章
- 关于Vision Transformer的一些思考
- .NET Core如何为项目提供高性能解决方案?
- 【图像处理】MATLAB:退化函数及多种复原方法
- probable oracle net,ORA-28547: connection to server failed, probable Oracle Net admin error
- android虚拟机加载机制,Android虚拟机与类加载机制
- Unity3D 游戏引擎之平面小球重力感应详解【转】
- SpringBoot源码笔记分析
- Effective Java之避免使用终结方法(七)
- 《数据库SQL实战》找出所有员工当前薪水salary情况
- ruby与python_Ruby对比Python的优势和劣势
- vue 新版本 webpack 代理 跨域设置
- 矩阵维度必须一致_如何从看得懂到会使用矩阵思维
- java list集合增删改_Java中集合类list的增删改查
- 以下选项中表述为oracle,oracle 选择题
- 浏览器兼容之旅的第二站:各浏览器的Hack写法
- error CS1010 CS8025 CS1012 CS1525 常见文档错误解决
- java 解析二进制文件保存为txt文件
- win7怎么设置显示计算机,教您win7怎么设置分辨率
- 信息源按加工深度划分_信息检索教程
- NPM js 包管理器介绍