全栈项目-乐优商场-通用工具服务-通用异常处理


目录

文章目录

  • 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        // 后端项目

全栈项目-乐优商场-通用工具服务-通用异常处理相关推荐

  1. 王者荣耀全栈项目部署到阿里云服务器笔记

    王者荣耀全栈项目部署到阿里云服务器笔记 原创Charles_GX 最后发布于2020-03-27 01:27:00 阅读数 177  收藏 展开 王者荣耀全栈项目部署到阿里云服务器笔记 学习的项目来自 ...

  2. vue商城项目源码_CMS全栈项目之Vue和React篇(下)(含源码)

    今天给大家介绍的主要是我们全栈CMS系统的未讲解完的后台部分和前台部分,如果对项目背景和技术栈不太了解,可以查看我之前的文章 基于nodeJS从0到1实现一个CMS全栈项目(上) 基于nodeJS从0 ...

  3. 一个nuxt(vue)+mongoose全栈项目聊聊我粗浅的项目架构

    这是一篇求职文章 年龄21 坐标成都 找一份vue.js移动端H5工作 一份没有任何包装纯真实的简历 简历戳这 求职文章一共有两篇 另外一篇请点击一个基于Vue+TypeScript的[移动端]Vue ...

  4. Vue、Node全栈项目~面向小白的博客系统~

    个人博客系统 前言 ❝ 代码质量问题轻点喷(去年才学的前端),有啥建议欢迎联系我,联系方式见最下方,感谢! 页面有啥bug也可以反馈给我,感谢! 这是一套包含前后端代码的个人博客系统,欢迎各位提出建议 ...

  5. 面试超尴尬瞬间:我从没参与过一个全栈项目

    写简历是找工作的第一步,第二步就是面试,那么简历就是一块敲开面试大门的敲门砖,所以写简历的根本目的就是要体现出你的专业水平和项目经验,那么什么样的简历能够快速的抓住HR的眼球呢?作为前端工程师的简历来 ...

  6. 0217前端日报:2020前端实践|优雅的实现一个全栈项目

    给 「前端开发博客」 加星标,每天打卡学习 长按二维码即可识别"进入网页"查看哟~ 1.2020前端实践|优雅的实现一个全栈项目(一) vweb_visual是一个简单的后台管理项 ...

  7. 【javaWeb微服务架构项目——乐优商城day15】——会调用订单系统接口,实现订单结算功能,实现微信支付功能

    0.学习目标 会调用订单系统接口 实现订单结算功能 实现微信支付功能 源码笔记及资料: 链接:https://pan.baidu.com/s/1_opfL63P1pzH3rzLnbFiNw 提取码:v ...

  8. Vue、Nuxt服务端渲染,NodeJS全栈项目,面试小白的博客系统~~

    Holle,大家好,我是李白!! 一时兴起的开源项目,到这儿就告一段落了. 这是一个入门全栈之路的小项目,从设计.前端.后端.服务端,一路狂飙的学习,发量正在欣喜若狂~~ 接触过WordPress,H ...

  9. 【javaWeb微服务架构项目——乐优商城day03】——(搭建后台管理前端,Vuetify框架,使用域名访问本地项目,实现商品分类查询,cors解决跨域,品牌的查询)

    乐优商城day03 0.学习目标 1.搭建后台管理前端 1.1.导入已有资源 1.2.安装依赖 1.3.运行一下看看 1.4.目录结构 1.5.调用关系 2.Vuetify框架 2.1.为什么要学习U ...

  10. 【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. ...

最新文章

  1. 关于Vision Transformer的一些思考
  2. .NET Core如何为项目提供高性能解决方案?
  3. 【图像处理】MATLAB:退化函数及多种复原方法
  4. probable oracle net,ORA-28547: connection to server failed, probable Oracle Net admin error
  5. android虚拟机加载机制,Android虚拟机与类加载机制
  6. Unity3D 游戏引擎之平面小球重力感应详解【转】
  7. SpringBoot源码笔记分析
  8. Effective Java之避免使用终结方法(七)
  9. 《数据库SQL实战》找出所有员工当前薪水salary情况
  10. ruby与python_Ruby对比Python的优势和劣势
  11. vue 新版本 webpack 代理 跨域设置
  12. 矩阵维度必须一致_如何从看得懂到会使用矩阵思维
  13. java list集合增删改_Java中集合类list的增删改查
  14. 以下选项中表述为oracle,oracle 选择题
  15. 浏览器兼容之旅的第二站:各浏览器的Hack写法
  16. error CS1010 CS8025 CS1012 CS1525 常见文档错误解决
  17. java 解析二进制文件保存为txt文件
  18. win7怎么设置显示计算机,教您win7怎么设置分辨率
  19. 信息源按加工深度划分_信息检索教程
  20. NPM js 包管理器介绍

热门文章

  1. 关于最小二乘法快速计算公式汇总
  2. 数据处理与分析|涵盖七大分析方法
  3. log4j2自定义级别日志
  4. 项目管理工具表格全汇总(免费领)
  5. 和利时 浙大中控DCS组态软件,操作员在线模拟软件
  6. 电商平台后台管理系统--->系统详细设计(用户登录、商品管理模块)
  7. 浅谈算法书籍学习路线
  8. 实用技巧:阿里云服务器建立公网物联网服务器(解决阿里云服务器端口,公网连接不上的问题)
  9. 用C#.NET编写软件注册机
  10. Java进制转换工具类