我们知道在项目运行过程中肯定会出现一些问题,当出现异常的时候,我们一般往往是在Controller层中捕获并处理了,但这样做不利于我们统一管理。本文我们便来学习下全局异常处理器,让它来管理项目中所有的异常。

SpringMVC提供了一个异常处理接口,咱们要编写的全局异常处理器就得实现该接口,写好之后还得在SpringMVC的配置文件中配置一下。你不禁就要问了,咱们该如何编写这个全局异常处理器呢?只要大伙知道了全局异常处理器中的处理逻辑,就该晓得怎样写了。注意,全局异常处理器在整个系统中只有一个。

  • 1)捕获整个系统中发生的异常,并异常写入日志文件
  • 2)及时通知开发人员。例如发邮件、短信
  • 3)给用户展示一个友好的错误页面,例如:您的网络异常,请重试

从上图可知,当请求过来时先经过前端控制器,前端控制器将请求交给Controller层,Controller层将请求交给Service层,Service层将请求交给Dao层,当Dao层处理完请求之后,将处理结果返回给Service层,Service层再将返回结果返回给Controller层,Controller层再将返回结果返回给前端控制器。同理,如果出现异常,那么最终都会传到前端控制器,我们便可在前端控制器中对异常进行统一处理。

下面我们便在搜索系统工程中添加全局异常处理器。

在taotao-search-web工程下新建一个com.taotao.search.exception包,并在该包下新建一个GlobalExceptionResolver全局异常处理器类,如下图所示。此外,我们还需要在src/main/resources目录下放置一个log4j.properties日志文件。

为方便大家复制,现将以上全局异常处理器类的代码贴出,如下所示。

package com.taotao.search.exception;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.log4j.Logger;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;/*** 全局异常处理器的类* @author liayun**/
public class GlobalExceptionResolver implements HandlerExceptionResolver {private static Logger logger = Logger.getLogger(GlobalExceptionResolver.class);@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex) {// 1. 日志写入到日志文件中logger.error("运行时异常", ex);
//      System.out.println(ex.getMessage());
//      ex.printStackTrace();// 2. 及时的通知开发人员,例如发短信或者发邮件,你可以通过第三方的接口来发System.out.println("发短信");// 3. 给用户一个友好的提示,例如您的网络异常,请重试ModelAndView modelAndView = new ModelAndView();// 设置视图的信息// 设置模型的数据modelAndView.setViewName("error/exception"); // 不需要带后缀(.jsp),因为配置了视图解析器modelAndView.addObject("message", "您的网络异常,请重试");return modelAndView;}}

以上类的代码中用到了Logger这个类,这个类我们使用的是slf4j包下的,因为slf4j是一个平台,它可以处理各种日志文件,比如log4j。

在src/main/resources目录下我们还放置了一个log4j.properties文件(最好名字就叫log4j.properties,这样slf4j便会自动加载,不用再配置,如果叫别的名字那么还需要配置),而且log4j.properties文件的内容如下所示。

log4j.rootLogger=INFO,A3,STDOUTlog4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=[%p] [%l] %10.10c - %m%nlog4j.appender.A3=org.apache.log4j.RollingFileAppender
log4j.appender.A3.file=logs/server.log
log4j.appender.A3.MaxFileSize=1024KB
log4j.appender.A3.MaxBackupIndex=10
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=\n\n[%-5p] %d{yyyy-MM-dd HH\:mm\:ss,SSS} method\:%l%n%m%n

可以看到我们把日志的级别调整为INFO级别,这样可以少很多输出信息。A3级别对日志输出做了配置,即指定将日志信息写入到logs目录下的server.log文件当中,当文件大小达到1M的时候会重新生成一个文件接着写日志。STDOUT级别是指将日志输出到控制台上。

接着,我们需要在springmvc.xml配置文件中加载全局异常处理器,如下图所示。

为方便大家复制,现将springmvc.xml配置文件的内容贴出,如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"><!-- 加载外部属性文件 --><context:property-placeholder location="classpath:resource/*.properties" /><context:component-scan base-package="com.taotao.search.controller" /><mvc:annotation-driven /><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp" /></bean><!-- 配置静态资源映射 --><!-- 指定/WEB-INF/js/和/WEB-INF/css/下的所有的静态资源(包括子目录下的静态资源)都不被拦截 --><!-- mapping=/js/**:表示访问静态资源的路径的形式,/js/**表示可以访问/js/下的静态资源或者所有的子目录下的静态资源 --><!-- <mvc:resources location="/WEB-INF/js/" mapping="/js/**"/><mvc:resources location="/WEB-INF/css/" mapping="/css/**"/> --><!-- 全局异常处理器的配置 --><bean class="com.taotao.search.exception.GlobalExceptionResolver"></bean><!-- 引用Dubbo服务 --><dubbo:application name="taotao-search-web"/><dubbo:registry protocol="zookeeper" address="192.168.81.131:2181"/>  <dubbo:reference interface="com.taotao.search.service.SearchService" id="searchService" /></beans>

下面我们人为抛一个异常,在SearchController类的search方法中人为设置一个异常(10 / 0肯定会报异常)。

然后我们重启taotao-search-web工程,接着访问淘淘商城首页,在搜索栏中输入搜索关键字并进行搜索,你便会看到如下图所示的友好错误页面了,而且可以看到该页面的异常提示信息就是我们刚才定义的信息。

这时我们刷新taotao-search-web工程,便能看到一个logs目录,在它下面有一个server.log文件,打开它,便可以看到我们刚才人为设置的异常信息。此外,你还能在Eclipse控制台上看到打印出了相同的异常信息。

淘淘商城第67讲——全局异常处理相关推荐

  1. 一个淘淘商城项目送给你,愿你有一个灿烂的前程!

    写在前面 今天是2020年6月23日,星期二,天气晴.2020年已过一半,回想一下,这真是一个多灾多难的年份啊!可生活依然要继续,活着的人依然要继续前行.这是没道理的事情. 好了,回到主题,说说写这篇 ...

  2. 淘淘商城第32讲——CMS内容管理系统的搭建

    上文我们一起搭建了表现层中的商城门户系统,即taotao-portal-web工程,本文我将教大家如何搭建CMS内容管理系统.说到这里,那什么是内容管理系统呢? 要不你给我说说内容管理系统 为什么需要 ...

  3. 淘淘商城第69讲——安装ActiveMQ

    准备工作 新建一台虚拟机 首先,新建一台虚拟机,而且最好设置为固定IP地址,别跟我说你不知道怎么做,要是你真不晓得,那么可以参考我下面的两篇文章. Linux入门第三讲--VMware Worksta ...

  4. 淘淘商城第111讲——订单系统服务层和表现层工程搭建

    首先我们还是先看一眼淘淘商城的系统架构,如下图所示,可以看到订单系统是一个单独的模块,分服务层和表现层,服务层负责存储订单,表现层负责展示订单. 下面我们便要开始搭建工程了,可以先搭建订单系统的服务层 ...

  5. 淘淘商城第8讲——向SVN服务器提交代码

    回顾一下之前所新建的SVN仓库 在上一讲中,我们一起学习了如何来安装SVN服务器并且新建了一个名称为taotao-javaee的空的仓库,如下图所示. 从上图中我们可以清楚地看到taotao-java ...

  6. 淘淘商城第11讲——如何安装单机版Zookeeper?

    Zookeeper是什么? Zookeeper是Apacahe Hadoop的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbo服务的注册中心,工业强度较高(稳定性好),可用于生产环境,并 ...

  7. 淘淘商城第103讲——js跨域分析

    通过前几讲的学习,我有理由相信大家都写完了用户登录这个接口,登录的时候我们把token写入到了Cookie当中,登录成功后,我们查看Cookie的信息,如下图所示,发现是有token信息的. 我们回到 ...

  8. 淘淘商城第80讲——快速入门freemarker

    前言 通过上一讲的学习,我相信大家都已经学会了如何在商品详情页面展示时添加缓存,而从本讲开始,我们接下来就会步入到freemarker的学习中. 我们都知道,缓存可以提高查询性能,但是当用户访问量很大 ...

  9. 淘淘商城第118讲——系统部署演示

    部署分析 首先说下淘淘商城这个项目在真实环境中部署的话需要多少台服务器. 如果你写完淘淘商城这个项目,那么你会发现该项目一共有12个工程,它们分别是: 本着高可用的原则,每个工程至少要对应有两台服务器 ...

最新文章

  1. eclipse发布web项目到生产环境的方式汇总(tomcat)
  2. Android Studio 3.0+ Record Espresso Test 自动化测试
  3. HTML基础,块级元素/行内元素/行内块元素辨析【2分钟掌握】
  4. (5)vivado不能生成bit文件(学无止境)
  5. 【报告分享】2019年中国95后洞察报告.pdf(附下载链接)
  6. Docker 数据管理
  7. matlab画平滑曲线的两种方法
  8. 游戏多开的原理与方法
  9. excel锁定第一行_将Excel标题行锁定在适当的位置
  10. 无忧代理免费ip爬取(端口js加密)
  11. 苹果公司发布iPhone 5s和iPhone 5c
  12. 电脑端微信文件的存储位置在哪?
  13. 获取安卓手机唯一设备号
  14. 3分频器 verilog解析
  15. 华为云Web应用防火墙 ——为网络安全打通“第一公里”
  16. 设计模式:第四章 中介模式
  17. wps 2019个人版 创建布尔运算
  18. 定语从句--专升本语法
  19. ntpd服务状态及日志查询方式
  20. com.googlecode.genericdao

热门文章

  1. 家电售后php网站源码,php家电维修源码-第一次接触php语言的最经典,最简单的源代码!!!!!!!!!!-电气资讯 - 电工屋...
  2. 8、ZigBee 开发教程之基础篇—CC2530 定时器T3的使用
  3. Python入门(廖雪峰老师)
  4. 团队环境搭建:MTK平台,Android 9.0内销TV编译服务器配置
  5. visual studio 2019 在安装windows sdk 10.1.18362.1组件时卡住的问题解决
  6. 直接从硬盘安装 win10 系统
  7. 思科模拟器之网络访问控制
  8. OpenGL.ES在Android上的简单实践:11-全景(索引-深度测试)
  9. ORC 2V2 详细心得
  10. 最新彩虹云商城代刷完整源码6.9.0+去除授权