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-异常拦截相关推荐

  1. Java秒杀系统实战系列~RabbitMQ死信队列处理超时未支付的订单(转)

    转自: https://juejin.cn/post/6844903903130042376 文末有源代码,非常棒 摘要: 本篇博文是"Java秒杀系统实战系列文章"的第十篇,本篇 ...

  2. Java秒杀系统实战系列~定时任务补充处理超时未支付的订单

    摘要: 本篇博文是"Java秒杀系统实战系列文章"的第十一篇,本篇博文我们将借助定时任务调度组件来辅助"失效超时未支付的订单记录"的处理,用以解决上篇博文中采用 ...

  3. Java秒杀系统实战系列~分布式唯一ID生成订单编号

    摘要: 本篇博文是"Java秒杀系统实战系列文章"的第七篇,在本博文中我们将重点介绍 "在高并发,如秒杀的业务场景下如何生成全局唯一.趋势递增的订单编号",我们 ...

  4. Java秒杀系统实战系列~构建SpringBoot多模块项目

    摘要:本篇博文是"Java秒杀系统实战系列文章"的第二篇,主要分享介绍如何采用IDEA,基于SpringBoot+SpringMVC+Mybatis+分布式中间件构建一个多模块的项 ...

  5. Java秒杀系统实战系列~数据库级别Sql的优化与代码的调整

    摘要: 本篇博文是"Java秒杀系统实战系列文章"的第十三篇,从本篇文章开始我们将进入"秒杀代码优化"环节,本文将首先从数据库级别Sql的优化入手,结合调整秒杀 ...

  6. Java秒杀系统实战系列~JMeter压力测试重现秒杀场景中超卖等问题

    摘要: 本篇博文是"Java秒杀系统实战系列文章"的第十二篇,本篇博文我们将借助压力测试工具Jmeter重现秒杀场景(高并发场景)下出现的各种典型的问题,其中最为经典的当属&quo ...

  7. Java秒杀系统实战系列~基于Redisson的分布式锁优化秒杀逻辑

    摘要: 本篇博文是"Java秒杀系统实战系列文章"的第十五篇,本文我们将借助综合中间件Redisson优化"秒杀系统中秒杀的核心业务逻辑",解决Redis的原子 ...

  8. Java秒杀系统实战系列~商品秒杀代码实战

    摘要: 本篇博文是"Java秒杀系统实战系列文章"的第六篇,本篇博文我们将进入整个秒杀系统核心功能模块的代码开发,即"商品秒杀"功能模块的代码实战. 内容: & ...

  9. Java秒杀系统方案优化 高性能高并发实战 学习笔记

    秒杀系统 (一)搭建环境 自定义封装Result类 自定义封装CodeMsg类 集成redis和rabbit 封装RedisService类 断言和日志测试 (二)实现用户登录和分布式Session ...

最新文章

  1. 森林正版服务器,The Forest 专用服务器设置向导
  2. java 扑克牌排序_java 怎么写compareto方法实现扑克牌排序
  3. 毕业典礼留学生代表发言:中国是我可亲可敬可爱的第二故乡,我已修炼出一颗中国心!...
  4. 解决连接mysql报错1130
  5. 小米路由 php 服务器,小米路由器在后台不停访问小米服务器发送设备信息,继续分析发现不止如此,还......
  6. python c语言接口_C/C++ 提供 Python 接口
  7. Windows Phone 7 优秀开源项目概览 来源:http://www.cnblogs.com/porscheyin/archive/2010/12/15/1906476.html...
  8. 微软最有价值专家(MVP)四连任
  9. 小程序的1024KB
  10. 下面哪个不是python合法的变量名_下面哪个不是Python合法的标识符
  11. Android O 自定义prop的问题小总结
  12. 删除SATA硬盘安全删除硬件图标
  13. 批量导入手机通讯录_手机QQ批量导入电话号码
  14. 【敬伟ps教程】PS基础知识了解
  15. Cocos2d-x 3.1.1 学习日志16--A星算法(A*搜索算法)学问
  16. SQL语句实现查询SQL Server服务器名称和IP地址_MsSql
  17. hive中的绣花模型_跨界媒介的碰撞:蜂巢+刺绣 | Ava Roth 「艺术访谈」
  18. 为什么尽量不要使用全局变量?
  19. JavaAndroid调试方法
  20. 日语五十音图学习笔记

热门文章

  1. pypbc的使用与一个密码方案的实现
  2. Android异常篇 Failed to initialize editor
  3. mysql错误码 1213_mysql error 1201-1300错误分析
  4. 支付宝正在研发掌纹支付功能
  5. AIBlockChain:“知名博主独家讲授”人工智能创新应用竞赛【精选实战作品】之《基于计算机视觉、自然语言处理、区块链和爬虫技术的智能会议系统》软件系统案例的界面简介、功能介绍分享之四、数据挖掘
  6. C++程序设计:实验一 CMatrix类设计与实现
  7. 青龙面板之小黄鸟抓包
  8. python计算身份证最后一位数字代表什么_身份证最后一位X代表什么数字
  9. 在校大学生如何注册并成功申请GEE账号
  10. 苹果8参数配置_3千元手机买苹果还是安卓?