Java秒杀系统-2.5-异常拦截
1.定义异常类
继承于RuntimeException.
package com.zengjx.miaosha.exception;import com.zengjx.miaosha.result.CodeMsg;public class GlobalException extends RuntimeException{private static final long serialVersionUID = 1L;private CodeMsg cm;public GlobalException(CodeMsg cm) {super(cm.toString());this.cm = cm;}public CodeMsg getCm() {return cm;}}
2.GlobalExceptionHandler 异常处理类
SpringMVC @ControllerAdvice
三个主要功能
1.全局异常处理
2.全局数据绑定
3.全局数据处理
资料: https://www.cnblogs.com/lenve/p/10748453.html
SpringMVC 中 @ControllerAdvice 注解的三种使用场景! @ControllerAdvice ,很多初学者可能都没有听说过这个注解,实际上,这是一个非常有用的注解,顾名思义,这是一个增强的 Controller。使用这个 Controller ,可以实现三个方面的功能:
全局异常处理
全局数据绑定
全局数据预处理
灵活使用这三个功能,可以帮助我们简化很多工作,需要注意的是,这是 SpringMVC 提供的功能,在 Spring Boot 中可以直接使用,下面分别来看。
全局异常处理
使用 @ControllerAdvice 实现全局异常处理,只需要定义类,添加该注解即可定义方式如下:
@ControllerAdvice
public class MyGlobalExceptionHandler {@ExceptionHandler(Exception.class)public ModelAndView customException(Exception e) {ModelAndView mv = new ModelAndView();mv.addObject("message", e.getMessage());mv.setViewName("myerror");return mv;}
}
在该类中,可以定义多个方法,不同的方法处理不同的异常,例如专门处理空指针的方法、专门处理数组越界的方法...,也可以直接向上面代码一样,在一个方法中处理所有的异常信息。
@ExceptionHandler 注解用来指明异常的处理类型,即如果这里指定为 NullpointerException,则数组越界异常就不会进到这个方法中来。
全局数据绑定
全局数据绑定功能可以用来做一些初始化的数据操作,我们可以将一些公共的数据定义在添加了 @ControllerAdvice 注解的类中,这样,在每一个 Controller 的接口中,就都能够访问导致这些数据。
使用步骤,首先定义全局数据,如下:
@ControllerAdvice
public class MyGlobalExceptionHandler {@ModelAttribute(name = "md")public Map<String,Object> mydata() {HashMap<String, Object> map = new HashMap<>();map.put("age", 99);map.put("gender", "男");return map;}
}
使用 @ModelAttribute 注解标记该方法的返回数据是一个全局数据,默认情况下,这个全局数据的 key 就是返回的变量名,value 就是方法返回值,当然开发者可以通过 @ModelAttribute 注解的 name 属性去重新指定 key。
定义完成后,在任何一个Controller 的接口中,都可以获取到这里定义的数据:
@RestController
public class HelloController {@GetMapping("/hello")public String hello(Model model) {Map<String, Object> map = model.asMap();System.out.println(map);int i = 1 / 0;return "hello controller advice";}
}
全局数据预处理
考虑我有两个实体类,Book 和 Author,分别定义如下:
public class Book {private String name;private Long price;//getter/setter
}
public class Author {private String name;private Integer age;//getter/setter
}
此时,如果我定义一个数据添加接口,如下:
@PostMapping("/book")
public void addBook(Book book, Author author) {System.out.println(book);System.out.println(author);
}
这个时候,添加操作就会有问题,因为两个实体类都有一个 name 属性,从前端传递时 ,无法区分。此时,通过 @ControllerAdvice 的全局数据预处理可以解决这个问题
解决步骤如下:
1.给接口中的变量取别名
@PostMapping("/book")
public void addBook(@ModelAttribute("b") Book book, @ModelAttribute("a") Author author) {System.out.println(book);System.out.println(author);
}
2.进行请求数据预处理
在 @ControllerAdvice 标记的类中添加如下代码:
@InitBinder("b")
public void b(WebDataBinder binder) {binder.setFieldDefaultPrefix("b.");
}
@InitBinder("a")
public void a(WebDataBinder binder) {binder.setFieldDefaultPrefix("a.");
}
@InitBinder("b") 注解表示该方法用来处理和Book和相关的参数,在方法中,给参数添加一个 b 前缀,即请求参数要有b前缀.
3.发送请求
请求发送时,通过给不同对象的参数添加不同的前缀,可以实现参数的区分.
判断是否是绑定异常
package com.zengjx.miaosha.exception;import java.util.List;import javax.servlet.http.HttpServletRequest;import com.zengjx.miaosha.controller.LoginController;
import com.zengjx.miaosha.result.CodeMsg;
import com.zengjx.miaosha.result.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice//
@ResponseBody
public class GlobalExceptionHandler {private static Logger logger= LoggerFactory.getLogger(LoginController.class) ;@ExceptionHandler(value=Exception.class)public Result<String> exceptionHandler(HttpServletRequest request, Exception e){logger.info("GlobalExceptionHandlerlogger","exceptionHandler......");e.printStackTrace();if(e instanceof GlobalException) {GlobalException ex = (GlobalException)e;return Result.error(ex.getCm());}else if(e instanceof BindException) {//判断是否是绑定异常BindException ex = (BindException)e;List<ObjectError> errors = ex.getAllErrors();ObjectError error = errors.get(0);String msg = error.getDefaultMessage();return Result.error(CodeMsg.BIND_ERROR.fillArgs(msg));}else {return Result.error(CodeMsg.SERVER_ERROR);}}
}
调试:输入错误格式的手机号
页面弹出窗显示“手机格式”
Java秒杀系统-2.5-异常拦截相关推荐
- Java秒杀系统实战系列~RabbitMQ死信队列处理超时未支付的订单(转)
转自: https://juejin.cn/post/6844903903130042376 文末有源代码,非常棒 摘要: 本篇博文是"Java秒杀系统实战系列文章"的第十篇,本篇 ...
- Java秒杀系统实战系列~定时任务补充处理超时未支付的订单
摘要: 本篇博文是"Java秒杀系统实战系列文章"的第十一篇,本篇博文我们将借助定时任务调度组件来辅助"失效超时未支付的订单记录"的处理,用以解决上篇博文中采用 ...
- Java秒杀系统实战系列~分布式唯一ID生成订单编号
摘要: 本篇博文是"Java秒杀系统实战系列文章"的第七篇,在本博文中我们将重点介绍 "在高并发,如秒杀的业务场景下如何生成全局唯一.趋势递增的订单编号",我们 ...
- Java秒杀系统实战系列~构建SpringBoot多模块项目
摘要:本篇博文是"Java秒杀系统实战系列文章"的第二篇,主要分享介绍如何采用IDEA,基于SpringBoot+SpringMVC+Mybatis+分布式中间件构建一个多模块的项 ...
- Java秒杀系统实战系列~数据库级别Sql的优化与代码的调整
摘要: 本篇博文是"Java秒杀系统实战系列文章"的第十三篇,从本篇文章开始我们将进入"秒杀代码优化"环节,本文将首先从数据库级别Sql的优化入手,结合调整秒杀 ...
- Java秒杀系统实战系列~JMeter压力测试重现秒杀场景中超卖等问题
摘要: 本篇博文是"Java秒杀系统实战系列文章"的第十二篇,本篇博文我们将借助压力测试工具Jmeter重现秒杀场景(高并发场景)下出现的各种典型的问题,其中最为经典的当属&quo ...
- Java秒杀系统实战系列~基于Redisson的分布式锁优化秒杀逻辑
摘要: 本篇博文是"Java秒杀系统实战系列文章"的第十五篇,本文我们将借助综合中间件Redisson优化"秒杀系统中秒杀的核心业务逻辑",解决Redis的原子 ...
- Java秒杀系统实战系列~商品秒杀代码实战
摘要: 本篇博文是"Java秒杀系统实战系列文章"的第六篇,本篇博文我们将进入整个秒杀系统核心功能模块的代码开发,即"商品秒杀"功能模块的代码实战. 内容: & ...
- Java秒杀系统方案优化 高性能高并发实战 学习笔记
秒杀系统 (一)搭建环境 自定义封装Result类 自定义封装CodeMsg类 集成redis和rabbit 封装RedisService类 断言和日志测试 (二)实现用户登录和分布式Session ...
最新文章
- 森林正版服务器,The Forest 专用服务器设置向导
- java 扑克牌排序_java 怎么写compareto方法实现扑克牌排序
- 毕业典礼留学生代表发言:中国是我可亲可敬可爱的第二故乡,我已修炼出一颗中国心!...
- 解决连接mysql报错1130
- 小米路由 php 服务器,小米路由器在后台不停访问小米服务器发送设备信息,继续分析发现不止如此,还......
- python c语言接口_C/C++ 提供 Python 接口
- Windows Phone 7 优秀开源项目概览 来源:http://www.cnblogs.com/porscheyin/archive/2010/12/15/1906476.html...
- 微软最有价值专家(MVP)四连任
- 小程序的1024KB
- 下面哪个不是python合法的变量名_下面哪个不是Python合法的标识符
- Android O 自定义prop的问题小总结
- 删除SATA硬盘安全删除硬件图标
- 批量导入手机通讯录_手机QQ批量导入电话号码
- 【敬伟ps教程】PS基础知识了解
- Cocos2d-x 3.1.1 学习日志16--A星算法(A*搜索算法)学问
- SQL语句实现查询SQL Server服务器名称和IP地址_MsSql
- hive中的绣花模型_跨界媒介的碰撞:蜂巢+刺绣 | Ava Roth 「艺术访谈」
- 为什么尽量不要使用全局变量?
- JavaAndroid调试方法
- 日语五十音图学习笔记
热门文章
- pypbc的使用与一个密码方案的实现
- Android异常篇 Failed to initialize editor
- mysql错误码 1213_mysql error 1201-1300错误分析
- 支付宝正在研发掌纹支付功能
- AIBlockChain:“知名博主独家讲授”人工智能创新应用竞赛【精选实战作品】之《基于计算机视觉、自然语言处理、区块链和爬虫技术的智能会议系统》软件系统案例的界面简介、功能介绍分享之四、数据挖掘
- C++程序设计:实验一 CMatrix类设计与实现
- 青龙面板之小黄鸟抓包
- python计算身份证最后一位数字代表什么_身份证最后一位X代表什么数字
- 在校大学生如何注册并成功申请GEE账号
- 苹果8参数配置_3千元手机买苹果还是安卓?