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

淘客手机版网站怎么做在线工具

淘客手机版网站怎么做,在线工具,个人网站logo生成,有阿里空间怎么做网站接上篇文章的统一数据格式返回… 文章目录 1. 统一异常处理1.1 使用 2. 统一数据返回和统一异处理是怎么实现的2.1 initHandleAdapters2.2 initHandleExceptionResolvers 1. 统一异常处理 1.1 使用 统一异常处理的两个关键的注解是ControllerAdvice ExceptionHandler Contro…

接上篇文章的统一数据格式返回…


文章目录

    • 1. 统一异常处理
      • 1.1 使用
    • 2. 统一数据返回和统一异处理是怎么实现的
      • 2.1 `initHandleAdapters`
      • 2.2 `initHandleExceptionResolvers`


1. 统一异常处理

1.1 使用

统一异常处理的两个关键的注解是@ControllerAdvice + @ExceptionHandler

  • @ControllerAdvice 表示控制器通知类
  • @ExceptionHandler:是异常处理器

两者结合就表示:出现异常的时候执行某个通知,也就是执行某个方法具体的代码如下:

@ControllerAdvice
@ResponseBody
public class ErrorAdvice {@ExceptionHandlerpublic Object handleException(Exception e) {//表示代码如果出现Exception(及其之类)异常,就返回Result的对象return Result.fail(e.getMessage());}
}

其中Result是自定义的放回结果类:
image.png
同时,我们可以针对不同的异常,返回不同的结果

@ControllerAdvice
@ResponseBody
public class ErrorAdvice {@ExceptionHandlerpublic Object handleException(Exception e) {//表示代码如果出现Exception(及其之类)异常,就返回Result的对象return Result.fail(e.getMessage());}@ExceptionHandlerpublic Object handleException(ArithmeticException e) {return Result.fail("算术异常" + e.getMessage());}@ExceptionHandlerpublic Object handleException(NullPointerException e) {return Result.fail("空指针异常" + e.getMessage());}
}

测试:

@RequestMapping("/test")
@RestController
public class TestController {@RequestMapping("/Test1")public String Test1() {int a = 10 / 0;return "t1";}@RequestMapping("Test2")public String Test2() {int[] arr = new int[4];int b = arr[4];return "t2";}
}

image.png
image.png

2. 统一数据返回和统一异处理是怎么实现的

统一数据返回和统一异处理是怎么实现的?
我们从DispatcherServlet的代码开始分析
当Tomcat启动的时候,有一个核心的类DispatcherServlet,用来控制程序的执行顺序
这个对象在创建的时候,会初始化一系列的对象:
image.png
其中与统一数据返回和统一异常处理相关的就是initHandleAdaptersinitHandleExceptionResolvers

2.1 initHandleAdapters

这个⽅法在执时会查找使用所有的 @ControllerAdvice 类,把 ResponseBodyAdvice
放在容器中,当发⽣某个事件时,调⽤相应的Advice⽅法,⽐如返回数据前调⽤统⼀数据封装

private void initControllerAdviceCache() {if (getApplicationContext() == null) {return;}//查找所有被@ControllerAdvice注解的BeanList<ControllerAdviceBean> adviceBeans = ControllerAdviceBean.findAnnotatedBeans(getApplicationContext());List<Object> requestResponseBodyAdviceBeans = new ArrayList<>();for (ControllerAdviceBean adviceBean : adviceBeans) {Class<?> beanType = adviceBean.getBeanType();if (beanType == null) {throw new IllegalStateException("Unresolvable type for ControllerAdviceBean: " + adviceBean);}Set<Method> attrMethods = MethodIntrospector.selectMethods(beanType, MODEL_ATTRIBUTE_METHODS);if (!attrMethods.isEmpty()) {this.modelAttributeAdviceCache.put(adviceBean, attrMethods);}Set<Method> binderMethods = MethodIntrospector.selectMethods(beanType, INIT_BINDER_METHODS);if (!binderMethods.isEmpty()) {this.initBinderAdviceCache.put(adviceBean, binderMethods);}//遍历adviceBeans列表,检查每个ControllerAdviceBean对应的bean类型是否实现了RequestBodyAdvice或ResponseBodyAdvice接口if (RequestBodyAdvice.class.isAssignableFrom(beanType) || ResponseBodyAdvice.class.isAssignableFrom(beanType)) {requestResponseBodyAdviceBeans.add(adviceBean);}}if (!requestResponseBodyAdviceBeans.isEmpty()) {this.requestResponseBodyAdvice.addAll(0, requestResponseBodyAdviceBeans);}if (logger.isDebugEnabled()) {int modelSize = this.modelAttributeAdviceCache.size();int binderSize = this.initBinderAdviceCache.size();int reqCount = getBodyAdviceCount(RequestBodyAdvice.class);int resCount = getBodyAdviceCount(ResponseBodyAdvice.class);if (modelSize == 0 && binderSize == 0 && reqCount == 0 && resCount == 0) {logger.debug("ControllerAdvice beans: none");}else {logger.debug("ControllerAdvice beans: " + modelSize + " @ModelAttribute, " + binderSize +" @InitBinder, " + reqCount + " RequestBodyAdvice, " + resCount + " ResponseBodyAdvice");}}}

2.2 initHandleExceptionResolvers

initHandleExceptionResolvers方法会取得所有实现了HandleExceeptionResolver接口的Bean,其中就有一个ExceptionHandlerExceptionResolver 的bean,这个Bean在应用启动的时候或获取到所有被注解@ControllerAdvice标注的bean对象,做进一步处理
image.png
当Controller抛出异常的时候,DispatcherServlet使用ExceptionHandlerExceptionResolver 来解析异常,而ExceptionHandlerExceptionResolver 通过ExceptionHandlerMethodResolver 来解析异常

@Nullable
private Method getMappedMethod(Class<? extends Throwable> exceptionType) {List<Class<? extends Throwable>> matches = new ArrayList<>();for (Class<? extends Throwable> mappedException : this.mappedMethods.keySet()) {if (mappedException.isAssignableFrom(exceptionType)) {matches.add(mappedException);}}if (!matches.isEmpty()) {if (matches.size() > 1) {matches.sort(new ExceptionDepthComparator(exceptionType));}return this.mappedMethods.get(matches.get(0));}else {return NO_MATCHING_EXCEPTION_HANDLER_METHOD;}
}

我们通过调试来看处理异常的整个过程
image.png

断点打在这个地方(第一次执行到的时候不是我们想要的,按f9会再次跳到这个地方第二次执行)
image.png

往下执行,就会发现此时正在遍历mappedMethods,里面就是我们在ErrorAdvice里面指定的所有异常
image.png

遍历完后,实际上就是筛选出哪些异常能够处理我们当前的异常类型,由于我们当前是算术异常,那么能匹配的就留下了两个
image.png

调用sort方法之后,就会按照优先级排序好,以便我们更精确的处理异常
image.png

http://www.hkea.cn/news/473856/

相关文章:

  • 站长工具seo综合查询权重百度在线搜索
  • 伊犁网站建设评价怎样才能上百度
  • 房地产网站建设方案百度实名认证
  • 做外贸可以在哪些网站注册网络项目免费的资源网
  • 中国建设银行信用卡网站首页青岛关键词优化平台
  • 阿里云网站建设考试题目长沙网站推广服务公司
  • 甘肃建设项目审批权限网站俄罗斯搜索引擎yandex官网入口
  • 网站建设公司新员工培训ppt模板百度热门搜索排行榜
  • 仿魔客吧网站模板网址大全是ie浏览器吗
  • 网站产品后台界面怎么做湖南关键词排名推广
  • 网站数据每隔几秒切换怎么做的湖南百度seo排名点击软件
  • 网站制作先学什么百度新闻下载安装
  • 河南省网站建设哪家好免费观看行情软件网站进入
  • 粘合剂东莞网站建设体育热点新闻
  • 百度网站排名关键词整站优化培训网站建设
  • 网络平台代理seo外包 杭州
  • 东方头条网站源码免费推广软件工具
  • 北京网站建设公司分享网站改版注意事项流程优化四个方法
  • 案例学 网页设计与网站建设手机百度seo快速排名
  • 江门网站建设总部电话产品推广渠道有哪些
  • 网站建设全攻略站长之家ping检测
  • 导航网站 cmsgoogle chrome谷歌浏览器
  • wordpress看其他人博客优化师是做什么的
  • 现在哪个网站还做白拿2021小说排行榜百度风云榜
  • 网站流量seo提升seo排名的方法
  • 做html网站模板下载地址网站页面布局和样式设计
  • 公司网站邮箱费用磁力宅在线搜种子
  • wordpress 缺少临时文件夹刷关键词优化排名
  • 做网站要有什么团队淘宝关键词排名查询工具
  • 开源门户网站源码宁波谷歌seo