SpringBoot异常处理,值得学习
异常处理:背景:
最近在搭建属于自己的个人博客(码农小白的执念),自己搭建后端的时候首先考虑的是异常处理。
个人也是一边学习一边做,难免有疏漏的地方,希望朋友们在不对的地方提醒下。
技术栈: springBoot 2.5.3 Mybatis-plus thymeleaf mysql
该博客简单记录一下自己的学习过程,如果后面作出简单的demo来,那么会整理其中的细节发布出来。
推荐一个 Spring Boot 基础教程及实战示例:
https://github.com/javastacks/spring-boot-best-practice 异常处理
个人粗糙的学习和理解,我把异常错误分为三个,4xx,5xx,error(自定义)
常用的是404和500响应 404 (未找到) 服务器找不到请求的网页 服务器内部错误 服务器遇到错误,无法完成请求
在templates文件下创建404.html、500.html和error.html
如果创建的是4xx.html和5xx.html,那么当页面找不到或者程序内部错误的话,SpringBoot自动匹配到这两个页面,具体的源码在这里就不分析,感兴趣的可以去学习下。
"当我想将错误信息返回到我自定义的页面怎么写?
"
我们自顶向下来思考: 我们访问页面的时候,页面发生错误也好,找不到也好,是不是都要走它请求的Url,那我们怎么处理这个请求呢? 这时候我们自然而然的想到拦截器,所以编写ControllerExceptionHandler类,来专门拦截所有的异常请求。 当我们处理完异常后,把这个流放行,或者返回我们需要的自定义页面上。
这样就实现了我们上述的需求。
所需要的技术点: @ControllerAdvice 配合 @ExceptionHandler注解结合使用,当异常抛到controller层时,可以对异常进行统一的处理,规定返回的json格式或者跳转到指定的错误页面等. @ExceptionHandler(Exception.class) // 表示 捕获 全部异常 ModelAndView 其实就是两个作用,一个是指定返回页面,另一个是在返回页面的同时添加属性
通过Logger来打印获取相关的异常信息: //获取异常的信息 logger.error(() -> { return String.format("Request URL : %s,Exception : %s ", request.getRequestURL(),e); },e);
在这里自己走了一些弯路,小伙子自己走窄了,导包倒错了 。
这里我导的包是mybatis中的: import org.mybatis.logging.Logger; import org.mybatis.logging.LoggerFactory;
传参一直不对,只能走源码的路子了,看看自己调用的什么玩意:最后就写成了上述的代码格式。
我看其他人写的代码的时候才恍然大明白,如下: import org.slf4j.Logger; import org.slf4j.LoggerFactory; logger.error("Requst URL : {},Exception : {}", request.getRequestURL(),e);
可能有的朋友感觉没啥,但是我自己调了半个小时才出来,菜是原罪。
Logger这个只是在控制台输出,或者绑定了日志,会输出到日志中。
接着上述问题通过ModelAndView类实现:
"ModelAndView像极了Model。
" ModelAndView modelAndView = new ModelAndView(); //实例化一个ModelAndView modelAndView.addObject("url",request.getRequestURL()); //获取的url添加到model中 modelAndView.addObject("exception",e); //获取的异常信息 //返回给error页面 modelAndView.setViewName("error/error"); return modelAndView;
敲黑板:来新需求了!
如果我想从所有的异常中剥离出404异常并返回给SpringBoot让他自动处理页面怎么解。
按照学习的来说。当页面为null的时候,向上抛出一个自定义的异常类,该异常类标注了异常状态。 throw new NotFoundException("博客找不到,请联系管理员"); //自定义类 @ResponseStatus(HttpStatus.NOT_FOUND) public class NotFoundException extends RuntimeException{ public NotFoundException() { super(); } public NotFoundException(String message) { super(message); } }
然后我们可以在总的异常中通过 AnnotationUtils.findAnnotation 通过传入 AnnotatedElement 和 注解类型 来查找方法或者类对象上的注解。
如果满足条件可以抛出异常让SpringBoot接管。 if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) { throw e; } 结束:
如果你看到这里或者正好对你有所帮助,希望能点个关注或者推荐,感谢!
滴滴是下一个被反对的垄断者?滴滴发钱了!这是最近在滴滴司机圈里流传的消息。之所以会出现这么个消息,是因为最近滴滴在部分城市上线了0。01元低价抢购加速卡的活动预告,凡是完成每周任务,即可低价解锁下一周全时段的
无可撼动的安卓机皇!三星S22U来咯网友评论三星S22U是S系列和Note系列融合的情怀之作,可别搞错了,S22U绝不仅仅如此!在安卓旗舰纷纷缩水的大环境下,三星S22U却带来了堪称奢华的硬件配置,今天我们就来谈谈这
人邮时评丨全球6G竞速进入关键窗口期,我国面临哪些创新挑战?5G已经来了,6G还会远吗?随着5G网络规模化商用,全球针对6G研发的战略布局已全面展开。从年初北美NextG联盟推出6G路线图,到日前日本Beyond5G推进联盟计划向ITU提交
警惕互联网医美的甜蜜陷阱来源国际商报警惕互联网医美的甜蜜陷阱本报记者刘旭颖随着颜值经济概念不断兴起,近年来,互联网医美行业也焕发出勃勃生机。然而,整形日记造假产品真假混用非法手术造成难以挽回的身体伤害野蛮
Python解析式生成器举例生成一个列表,元素09,对每一个元素自增1后求平方返回新列表l1list(range(10))l2foriinl1l2。append((i1)2)print(l2)使用列表解析
如何禁用NetworkManagernetworkVSNetworkManagerRedHat7中已经默认使用了2种网络管理方式,network和NetworkManager,而一般使用都是network(基于静态配
海信又来颠覆认知Vidda纯三色激光微投的降维打击来了谁才是年度超500万台销量智能投影的真正顶流?在这位行业大佬出手之前,这个问题的任何答案都没有意义近日,据全球激光显示产业领军者激光电视真正的头牌海信视像在一份公告中称,行业首款纯
全国手机用户全部卸载拼多多,拼多多该何去何从?这是不可能的,萝卜青菜各有喜爱,只要你不要占小便宜,什么抽奖免单砍一刀等等,你不要参加就行了,买东西只要不贪小便宜,价格还是可以的,像多多买菜第一天下单第二天就到很方便,本人一直在
隐私照片应该怎样收蔵?隐私照片怎样收藏?之前陈老师的事件,给大家留下深刻的印象,所以隐私照片在电脑上,网盘上,均不安全,我个人建议用光盘或才加密的U盘会比较好些。网盘,就算自己加密了,现在黑客这么牛,网
死后,我们的微信怎么办?怎么办,太简单了,有人曾经提出把微信二维码刻在墓碑上,以介绍死者的生平。我觉得这是一个好办法,然后在二维码里写上微信添加方式。这下好了,每个人从躺进坟墓的那一刻起,每天都有8640
某百万主播大战砍拼多多,六万人在线帮砍两小时竟都没成功相信大家或多或少都有参与过拼多多砍价的活动那么大家是否成功过呢?近日某百万主播应粉丝要求开始大战拼多多,随后便选择了一款手机开砍之后进行了一系列的操作,接下来就是长达一小时的砍价过