IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【SpringBoot学习】09、统一异常处理与统一记录日志 -> 正文阅读

[Java知识库]【SpringBoot学习】09、统一异常处理与统一记录日志

1 统一异常处理

如果数据层有异常,就会抛给它的调用者业务层,业务层再抛给它的调用者表现层

无论是哪个层次的异常,都会汇到表现层,要对表现层统一处理异常

1.1 SpringBoot提供的方案

SpringBoot提供的方案:在特定路径上加上对应特定错误状态的页面(如:404,500),在发生该错误时就会自动转到起对应的页面

特定路径:templates目录下error文件夹,文件夹名一定要叫error,error下的文件名一定要是错误状态:404.html,500.html等)
在这里插入图片描述
这里注意:如果特定路径加了404.html,404时也不显示相应页面的话:删掉target文件夹重新编译就好了

1.2 Spring提供的方案

状态为500时,服务器需要打日志,页面需要更多提示信息,SpringBoot提供的方法不够用
在这里插入图片描述
本节我们利用ExceptionHandler统一处理所有可能的异常
1.在HomeController里提供访问500错误页面的方法

    //获取错误页面
    @RequestMapping(path = "/error",method = RequestMethod.GET)
    public String getErrorPage(){
        return "error/500";
    }

2.在controller包下新建类ExceptionAdvice
路径如图:
在这里插入图片描述

@ControllerAdvice(annotations = Controller.class)//该注解只扫描带有controller注解的Bean
public class ExceptionAdvice {
    private static final Logger logger = LoggerFactory.getLogger(ExceptionAdvice.class);

    @ExceptionHandler({Exception.class})//所有异常都用该方法处理
    public void handleException(Exception e, HttpServletRequest request, HttpServletResponse response) throws IOException {
        logger.error("服务器发生异常:" + e.getMessage());//打日志:服务器出错啦!
        for(StackTraceElement element : e.getStackTrace()){//出错的栈信息记录下来
            logger.error(element.toString());
        }
        
        //如果浏览器希望服务器响应的是网页,那就重定向到500错误页面
        //如果希望返回的是异步信息,就返回字符串(格式是JSON字符串,页面可以转成JSON)
        String xRequestedWith = request.getHeader("x-requested-with");//请求方式
        if("XMLHttpRequest".equals(xRequestedWith)){//异步请求
            response.setContentType("application/plain;charset=utf-8");
            PrintWriter writer = response.getWriter();
            writer.write(CommunityUtil.getJSONString(1,"服务器异常"));
        }else{//普通请求
            response.sendRedirect(request.getContextPath()+"/error");//重定向到500错误页面
        }

    }
}

2 统一记录日志

将日志写在Service里的话,万一要更改就很麻烦,如果将记录日志单独实现就会方便很多,AOP可以做到这一点
在这里插入图片描述
步骤:
1.加注解@Component
2.加注解@Aspect
3.声明切点

//所有的业务组件的所有方法、所有返回值都要处理
@Pointcut("execution(* com.nowcoder.community.service.*.*(..))")
    public void pointcut(){ }

4.写具体要执行的操作

    //在连接点之前做一些事情
    @Before("pointcut()")
    public void before(){
        System.out.println("before");
    }

示例:

@Component//声明为Bean
@Aspect//声明为Aspect组件
public class AlphaAspect {
    @Pointcut("execution(* com.nowcoder.community.service.*.*(..))")
    //切点,第一个*表示方法的返回值,后面两个*表示包名下的所有类的所有方法,(..)表示方法里所有的参数
    public void pointcut(){

    }
    //在连接点之前做一些事情
    @Before("pointcut()")
    public void before(){
        System.out.println("before");
    }

    //在连接点后面做一些事情
    @After("pointcut()")
    public void after(){
        System.out.println("after");
    }

    //在返回值以后做一些事情
    @AfterReturning("pointcut()")
    public void afterReturning(){
        System.out.println("afterReturning");
    }
    //在抛出异常以后做一些事情
    @AfterThrowing("pointcut()")
    public void afterThrowing(){
        System.out.println("afterThrowing");
    }
    //在前后
    @Around("pointcut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
        System.out.println("around-before");
        Object obj = joinPoint.proceed();
        System.out.println("around-after");
        return obj;
    }
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-04 13:15:32  更:2021-12-04 13:18:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:03:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码