【SpringBoot 2】(九)异常处理 web原生组件的注入

写在前面在这里插入图片描述🛫更多知识总结见SpringBoot 2专栏
🚕本篇知识点总结自尚硅谷雷神的视频
🚒博主对于该知识尚在学习阶段
🚄如果发现存在问题请毫不吝啬的指出
🚀🚀扎哇太枣糕的博客首页🚀🚀

文章目录

  • 1 异常处理
    • 1.1 异常处理之错误页面
    • 1.2 异常处理之精确捕获
    • 1.3 异常处理之自定义异常
    • 1.3 异常处理之框架底层异常
  • 2 web原生组件的注入
    • 2.1 servlet组件
    • 2.2 filter组件
    • 2.3 listener组件
  • 3 web实现定制化总结

1 异常处理

  默认情况下,SpringBoot会提供/error处理所有的错误请求并返回相应的信息,对于浏览器客户端来说会返回一个包含时间戳、状态码、错误信息、携带的自定义异常信息、发生错误的路径等信息的错误Whitelabel页面,对于机器客户端(postman等)会返回一个包含以上内容的JSON数据

1.1 异常处理之错误页面

  要想替代之前浏览器客户端返回的错误Whitelabel页面,需要将自定义的html页面放在静态资源static等的error文件夹下或者模板引擎templateserror文件夹下,这样的话出现错误时SpringBoot发送/error请求就会自动解析这些页面进行渲染。页面解析规则:先将状态码的值与error文件夹下的页面名进行精确匹配,如果精确匹配不到的话就按照4xx、5xx这样的方式进行模糊匹配,要是还匹配不到的话就返回Whitelabel页面在这里插	·入图片描述

1.2 异常处理之精确捕获

  要是说错误页面是按照状态码进行页面处理的话,精确捕获就是通过异常类进行捕获,捕获之后再进行一系列的自定义操作。具体步骤就是:创建一个异常处理器类,并在类上加@ControllerAdvice注解表明是一个异常处理器并向容器中注册该组件,@ExceptionHandler注解对参数中的异常类进行精准捕获,并在方法体定义具体的处理操作。

@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler({ArithmeticException.class, NullPointerException.class})public String handleArithException(Exception e) {log.info("系统捕获到异常信息:{}", e);return "login";}
}

1.3 异常处理之自定义异常

  有时候我们需要在程序中自定义一些运行时异常,这些异常并不会像那些异常一样产生异常状态码,甚至在未定义之前都不算是异常且不会影响程序的正常运行。这时就需要我们自定义异常的产生逻辑,并自定义异常类创建有参无参构造器,在类上加@ResponseStatus注解,使用注解参数定义异常响应码和异常信息

@ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "用户数量太多")
public class UserTooManyException extends RuntimeException{public UserTooManyException() {}public UserTooManyException(String message) {super(message);}
}

异常产生逻辑:

// 判断用户数量抛出用户数量过多的自定义异常
if (users.size() > 3) {throw new UserTooManyException();
}

1.3 异常处理之框架底层异常

  除了exception类中定义的异常外,spring框架底层也定义了一些异常,这些异常由DefaultHandlerExceptionResolver来处理

2 web原生组件的注入

2.1 servlet组件

  servlet组件需要自定义创建一个servlet类继承HttpServlet,并使用@WebServlet注解的urlPatterns属性声明拦截的请求,再通过主程序类上使用@ServletComponentScan(basePackages = “…”)注解将该组件扫描注册到容器中。

// 声明拦截的请求
@WebServlet(urlPatterns = "/my")
public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("385695");}
}

2.2 filter组件

  filter组件需要自定义创建一个filter类实现Filter接口,并使用@WebFilter注解的urlPatterns属性声明过滤的请求

@Slf4j
@WebFilter(urlPatterns = {"/css/*", "/images/*"})
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {log.info("MyFilter初始化……");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {log.info("MyFilter方法开始工作了……");filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {log.info("MyFilter销毁了……");}
}

2.3 listener组件

  listener组件需要自定义创建一个listener类实现ServletContextListener 接口,并使用@WebListener注解

@Slf4j
@WebListener
public class MyServletContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {log.info("MyServletContextListener监听到项目初始化完成……");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {log.info("MyServletContextListener监听到项目已经销毁……");}
}

除了使用注解进行注册之外,还可以使用配置类的方式将以上三种组件注册到容器中去

@Configuration
public class MyRegistConfig {@Beanpublic ServletRegistrationBean MyServlet() {MyServlet myServlet = new MyServlet();return new ServletRegistrationBean(myServlet, "/my", "/my02");}@Beanpublic FilterRegistrationBean myFilter() {MyFilter myFilter = new MyFilter();FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(myFilter);filterRegistrationBean.setUrlPatterns(Arrays.asList("/my", "/my02"));return filterRegistrationBean;}@Beanpublic ServletListenerRegistrationBean myListener() {MyServletContextListener listener = new MyServletContextListener();return new ServletListenerRegistrationBean(listener);}
}

  通过servlet组件声明的/my请求并不会经过spring的拦截器拦截处理,而是直接交由tomcat服务器进行处理:现在有这么两个组件拦截到我们发送的/my请求,一个是spring的组件DispatcherServlet通过/路径拦截到,一个是tomcat的自定义MyServlet组件通过/my路径拦截到。tomcat服务器对请求有这么一个处理规则,当多个servlet组件都能处理到同一个请求的时候,使用匹配度最高的组件进行处理,也就是说处理请求的是tomcatMyServlet组件。

3 web实现定制化总结

  • 创建配置类实现WebMvcConfigurer接口,重写相应的方法或者使用@Bean注解向容器中扩展功能(使用的最多)
  • 自定义配置类使用@Bean注解使用自定义的web原生组件替换容器中的默认组件或者向容器中添加组件
  • 配置文件的配置项修改
  • xxxCustomizer
  • @EnableWebMvc注解表示全面接管SpringMVC,导致的效果就是SpringBoot的所有自动配置全部失效,全部功能都需要自己进行配置。大佬专属注解,小白的禁术!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目管理最佳实践方法_项目管理最佳实践,企业如何进行有效的项目管理

前言:企业在划分项目时,可按照项目的复杂程度、管理范围等将项目分为三个级别,分别是企业级、部门级和小组级(与目标划分原则相同),然后将每一级的目标与项目对应起来。我们知道,企业制定的目标…

python 历遍子弹_python之子弹移动

"""新增功能:完成我方坦克发射子弹的移动"""import pygameimport timeimport randomwin_width 700win_height 500bg_color pygame.Color(0, 0, 0)text_color pygame.Color(255, 0, 0)class MainGame():window Nonemy_tank None…

【SpringBoot 2】(十)数据库相关

写在前面🛫更多知识总结见SpringBoot 2专栏 🚕本篇知识点总结自尚硅谷雷神的视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客首页🚀🚀…

线性分组码的最小汉明距为6_第二章 线性代数

2.1 标量、向量、矩阵和张量标量(scalar)一个标量就是一个单独的数,用斜体表示标量。向量(vector)一个向量是一列有序排列的数,用粗写的小写字母表示。矩阵(matrix)矩阵式一个二维数组,其中的么一个元素由两个索引(而非一个)所确定&#xff0…

【SpringBoot 2】(十一)单元测试JUnit 5 指标监控

写在前面🛫更多知识总结见SpringBoot 2专栏 🚕本篇知识点总结自尚硅谷雷神的视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客首页🚀🚀…

sklearn中lstm_分别用sklearn和tensorflow做房价预测

原标题:分别用sklearn和tensorflow做房价预测本篇是后面用tensorflow做回归时的一个参照,忍不住要说的是sklearn真是简单好用,要不是他没有卷积cnn等时髦模型,真是不想用其他家的了。经典的sklearn集成模型结果:真是又…

多个containers 共用一个pvc_2020阜新PVC-UH市政管厂家-烟台塑胶

2020阜新PVC-UH市政管厂家烟台金沃泉塑胶有限公司主要产品PVC-U、PVC-M、PVC-UH聚氯乙烯给给水管材、HDPE高密度聚乙烯给水管材、CPVC氯化聚氯乙烯、MPP高压电力电缆护套管、PERT-Ⅱ型热力管道、高分子托辊管、水处理膜壳管。公司为电网、南方电网、电建集团、建筑集团、五矿集…

【SpringBoot 2】(十二) profile功能 自定义starter

写在前面🛫更多知识总结见SpringBoot 2专栏 🚕本篇知识点总结自尚硅谷雷神的视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客首页🚀🚀…

jpa transaction 回滚_我遇到的JPA中事务回滚的问题

在最近的项目中,做的是解析XML文件,解析过程中会有异常,比如:XML文件中节点的数据和与之对应的数据库的字段中数据的类型不匹配;XML中数据长度超过数据库定义的长度;有数据了的重复插入问题;读取…

pb 怎么判断是 小数_考试90分以上的孩子是怎么学数学的?听听老师怎么说?

一二年级,考试上九十分很轻松。但是,不少小朋友一上三年级,成绩就落下来了。那么,我们来看看三年级起,考试还能够保持在90分以上的孩子是怎么学习数学的吧!第一,计算能力过关通过这两张图片的对…

快速上手Mybatis-Plus 入门案例

写在前面🛫更多知识总结见Mybatis-Plus专栏 🚕内容总结自尚硅谷杨博超老师的视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客首页🚀🚀…

交换机分布缓存_网络交换机缓存在数据中心的作用

什么产生了缓存?网络交换机要配置多少缓存才够用?缓存容量是否有标准可以衡量? 当网络交换机接口收到超出其所能处理的流量后,它会选择要么将其缓存,或者将其丢弃。 缓存通常都是因为网络接口速率不同造成的&#xff0…

黑苹果 选择语言 点不了_什么是天然的“黑钻”?—科普贴

天然黑钻也被成为“碳酸氢”,具有与白钻相同的化学成分,然而黑钻石的晶体结构是不同的,这意味着它们由许多小晶体组成,它们以随机的形式粘在一起,而不是一个具有可识别自然线的固体锥形。天然黑钻石有极高的含物&#…

sim卡没坏但苹果手机无服务_解决手机插SIM卡后都显示“无SIM卡”的故障问题

故障现象顾客描述手机插SIM卡后都显示“无SIM卡”。维修过程引起插入SIM卡却显示“无SIM卡”的故障,除了可能是SIM卡座的供电、时钟、复位及SIM卡插入检测信号不正常导致外,还有可能是基带不正常导致的。插上手机卡,左上角提示“无SIM卡”&am…

Mybatis-Plus实现简单的增删改查 实体类上的注解

写在前面🛫更多知识总结见Mybatis-Plus专栏 🚕内容总结自尚硅谷杨博超老师的视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客首页🚀🚀…

webpack 读取文件夹下的文件_webpack基本介绍及使用

1.什么是webpackwebpack是一个前端资源加载/打包工具。它根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。从上图看出,webpack可以将多种静态资源js,css,less转换成一个静态文件,减少…

conda失败说没有写权限_爱情中,为什么男生表白失败,女生还说可以继续做朋友,想过没有...

在爱情中,不是每个男生都是幸运的,也不是每次的表白都是如你所愿的。有成功总有失败,成功是喜悦的,但是失败却是痛苦的。不过有的时候男生和女生表白以后,女生对男生说了这样的一段,其实我希望以后我们还是…

Mybatis-Plus中Wrapper条件构造器的使用

写在前面 🛫更多知识总结见Mybatis-Plus专栏 🚕内容总结自尚硅谷杨博超老师的视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客首页🚀&#x1f680…

springboot设置默认值_线上Bug无法复现?老司机教你一招,SpringBoot远程调试不用愁!...

前言在部署线上项目时,相信大家都会遇到一个问题,线上的 Bug 但是在本地不会复现,多么无奈。此时最常用的就是取到前端传递的数据用接口测试工具测试,比如 POSTMAN,复杂不,难受不?今天陈某教你一…

Mybatis-Plus的分页 乐观锁插件 通用枚举 多数据源

写在前面🛫更多知识总结见Mybatis-Plus专栏 🚕内容总结自尚硅谷杨博超老师的视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客首页🚀🚀…