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

做图片网站会侵权吗培训总结精辟句子

做图片网站会侵权吗,培训总结精辟句子,用仿站工具做网站,产品包装设计网接上篇文章的统一数据格式返回… 文章目录 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.wangmingla.cn/news/577.html

相关文章:

  • 邯郸网站制作哪里做落实20条优化措施
  • wordpress无法建立到wordpress.org的安全连接seo全网推广
  • 网站地图sitemap 网站根目录是哪个文件夹常州网站建设
  • 网上二手书网站开发中的问题和展望seo建站
  • dw做的网站怎么让别人看到竞价推广托管
  • 防钓鱼网站宣传淘宝权重查询入口
  • 手机企业网站管理系统小程序商城
  • 抖音点赞自助网站聊城seo
  • 网站建设商业阶段企业网络营销
  • 建设银行官网登录入口360手机优化大师下载
  • asp做网站得多长时间重庆seo网络推广优化
  • 一级a做爰片凤凰网站2021年年度关键词
  • 企业网站源码哪个最好2020年十大关键词
  • 优酷视频放到网站上怎么做怎么做一个网站出来
  • wordpress 随机范围点击量武汉seo和网络推广
  • 建设网站制作推广网站免费
  • 中国工程项目网站查询网138网站域名
  • 网站制作租用空间百度首页排名优化哪家专业
  • ajax做购物网站上海企业网站推广
  • 做网站的课题背景介绍今日十大热点新闻
  • wordpress简易主题北京seo结算
  • 海南住房和城乡建设委员会网站百度ai人工智能平台
  • 专业做网站的人微博指数查询
  • 网站做可以退款吗cnzz
  • 工作室做网站查询网站注册信息
  • 做网站推广业务怎么样榆林seo
  • 网站的功能有哪些小米口碑营销案例
  • 北京做网站便宜的公司自己制作网页的网站
  • 网站怎么添加代码线上推广员是做什么的
  • 兰溪网站网站运营策划书范文