【299期】Spring Boot 异常处理,值得学习!

点击上方“Java精选”,选择“设为星标”

别问别人为什么,多问自己凭什么!

下方有惊喜,留言必回,有问必答!

每一天进步一点点,是成功的开始...

背景

最近在搭建属于自己的个人博客(码农小白的执念),自己搭建后端的时候首先考虑的是异常处理。

个人也是一边学习一边做,难免有疏漏的地方,希望朋友们在不对的地方提醒下。

技术栈:

  1. springBoot 2.5.3

  2. Mybatis-plus

  3. thymeleaf

  4. mysql

该博客简单记录一下自己的学习过程,如果后面作出简单的demo来,那么会整理其中的细节发布出来。

异常处理

个人粗糙的学习和理解,我把异常错误分为三个,4xx,5xx,error(自定义)

常用的是404和500响应

  • 404 (未找到) 服务器找不到请求的网页

  • 服务器内部错误 服务器遇到错误,无法完成请求

在templates文件下创建404.html、500.html和error.html

另外,推荐下 Spring boot 的实战开源项目:
https://gitee.com/yoodb/jing-xuan

如果创建的是4xx.html和5xx.html,那么当页面找不到或者程序内部错误的话,SpringBoot自动匹配到这两个页面,具体的源码在这里就不分析,感兴趣的可以去学习下。

当我想将错误信息返回到我自定义的页面怎么写?

我们自顶向下来思考:

  1. 我们访问页面的时候,页面发生错误也好,找不到也好,是不是都要走它请求的Url,那我们怎么处理这个请求呢?

  2. 这时候我们自然而然的想到拦截器,所以编写ControllerExceptionHandler类,来专门拦截所有的异常请求。

  3. 当我们处理完异常后,把这个流放行,或者返回我们需要的自定义页面上。

这样就实现了我们上述的需求。

所需要的技术点:

  1. @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;

传参一直不对,只能走源码的路子了,看看自己调用的什么玩意:最后就写成了上述的代码格式。另外,更多面试题,公众号Java精选,回复java面试,获取面试题资料。

我看其他人写的代码的时候才恍然大明白,如下:

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让他自动处理页面怎么解。

推荐下几个月熬夜整理的近 10000+ 面试资料大全:https://gitee.com/yoodb/ebooks

按照学习的来说。当页面为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;
}

看到这里希望对你有所帮助!

作者:xbhog

https://www.cnblogs.com/xbhog/p/15207278.html

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

------ THE END ------

319b797b4d97dd989b7a0356efd4bd5c.png精品资料,超赞福利!8b591b18436d03ac87cb37b998e5be7a.png

>Java精选面试题<
3000+ 道面试题在线刷,最新、最全 Java 面试题!

929098ecb5707f2ed6a51d4fd7953449.png

684035871c420dd913ff469ab38cac60.png

期往精选  点击标题可跳转

【291期】面试官问:如何优化慢 SQL 语句?5 大步骤和 10 个案例!

【292期】Spring Boot 三大专用开发工具,你都用过么?

【293期】京东一面:子线程如何获取父线程 ThreadLocal 值?

【294期】Spring Boot框架零入侵式注解,优雅的实现重处理功能

【295期】面试官问:如何选择合适的分布式 ID 生成方案?

【296期】多线程中的事务回滚如何处理,你真的用对了吗?

【297期】性能优化 8 种最坑的 SQL 错误用法,你有没有踩过“雷”?

【298期】美团一面、阿里一面复盘总结

ceaf1bebd789c2b49d3e19cb736757c1.png 技术交流群!d9ca3fc1e8dc0ebca851049a519fa4f5.png

最近有很多人问,有没有读者交流群!想知道如何加入?方式很简单,兴趣相投的朋友,只需要点击下方卡片,回复“加群”,即可无套路入交流群!

文章有帮助的话,在看,转发吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值