文档章节

基于Spring MVC的异常处理及日志管理

问题达人
 问题达人
发布于 2016/07/15 17:08
字数 810
阅读 65
收藏 10
点赞 0
评论 0
  1. Spring MVC处理异常有3种方式: 
  • 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver; 
  • 实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器; 
  • 使用@ExceptionHandler注解实现异常处理; 

 项目中才有第二种异常处理方式,个人比较推荐第二种和第三种实现方式。

    2.    使用SimpleMappingExceptionResolver实现异常处理 

  • 在Spring的配置文件applicationContext.xml中增加以下内容:  

 

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  

        <!-- 定义默认的异常处理页面,当该异常类型的注册时使用 -->  

        <property name="defaultErrorView" value="error"></property>  

        <!-- 定义异常处理页面用来获取异常信息的变量名,默认名为exception -->  

        <property name="exceptionAttribute" value="ex"></property>  

        <!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常也页名作为值 -->  

        <property name="exceptionMappings">  

            <props>  

                <prop key="cn.basttg.core.exception.BusinessException">error-business</prop>  

                <prop key="cn.basttg.core.exception.ParameterException">error-parameter</prop>  

                <!-- 这里还可以继续扩展对不同异常类型的处理 -->  

            </props>  

        </property>  

</bean>  

  •  使用SimpleMappingExceptionResolver进行异常处理,具有集成简单、有良好的扩展性、对已有代码没有入侵性等优点,但该方法仅能获取到异常信息,若在出现异常时,对需要获取除异常以外的数据的情况不适用。 

3. 实现HandlerExceptionResolver 接口自定义异常处理器  

public class EmvcExceptionHandler implements HandlerExceptionResolver {
    private static Log log = LogFactory.getLog(EmvcExceptionHandler.class);

    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object object, Exception exception) {
        String rurl = request.getServletPath();
        ModelAndView model = new ModelAndView();
        if (rurl.lastIndexOf(".do") > 0)
            model.setViewName("/commons/error/error");
        else {
            model.setViewName("/error");
        }

        //访问url
        String url = request.getServletPath();
        
        //访问的参数
        Enumeration enu = request.getParameterNames();
        StringBuffer params = new StringBuffer();
        while (enu.hasMoreElements()) {
            String paraName = (String) enu.nextElement();
            params.append(paraName + "=" + request.getParameter(paraName));
        }
        
        //描述信息
        String message =  exception.getMessage();
        
        //异常类型
        String exceptionType = exception.getClass().getName();
        
        //异常位置
        String position = null;
        ByteArrayOutputStream stackTrace = new ByteArrayOutputStream();
        exception.printStackTrace(new PrintStream(stackTrace));
        String content = stackTrace.toString();
        Pattern pat = Pattern.compile("com(.*)\\)");
        Matcher mat = pat.matcher(content);
        boolean rs = mat.find();
        if (rs) {
            position = mat.group(1);
        }
        position = "com"+position+")";
        
        XaskContext.getSystemData().saveExceptionLog(Arrays.asList(new ExceptionLog(url,params.toString(),message,exceptionType,position,new Date())));
        
        if ((exception instanceof XaskException)) {
            model.addObject("errorMsg", exception.getMessage());
            log.error(exception.getMessage());
            return model;
        }

        model.addObject("errorMsg", exception.getMessage());
        model.addObject("ex", exception);
        log.error("未处理异常", exception);
        return model;
    }
}

  • 在Spring的配置文件applicationContext.xml中增加以下内容:

    <bean id="exceptionHandler" class="cn.basttg.core.exception.MyExceptionHandler"/>

  • 使用实现HandlerExceptionResolver接口的异常处理器进行异常处理,具有集成简单、有良好的扩展性、对已有代码没有入侵性等优点,同时,在异常处理时能获取导致出现异常的对象,有利于提供更详细的异常处理信息。

4. 使用@ExceptionHandler注解实现异常处理 

  • 增加BaseController类,并在类中使用@ExceptionHandler注解声明异常处理,代码如下:

    @ExceptionHandler
    public String exp(HttpServletRequest request, Exception ex) {
        System.out.println("异常捕捉||||||"+ex.getClass() + "  ||||||======  " +ex.getMessage());
        request.setAttribute("ex", ex);
        // 根据不同错误转向不同页面
        if (ex instanceof ParameterException) {
            return "error-parameter";
        } else {
            return "error";
        }
    } 

  • 使所有需要异常处理的Controller都继承该类
  • 使用@ExceptionHandler注解实现异常处理,具有集成简单、有扩展性好(只需要将要异常处理的Controller类继承于BaseController即可)、不需要附加Spring配置等优点,但该方法对已有代码存在入侵性(需要修改已有代码,使相关类继承于BaseController),在异常处理时不能获取除异常以外的数据。 

 

© 著作权归作者所有

共有 人打赏支持
问题达人
粉丝 11
博文 91
码字总数 82252
作品 0
昌平
程序员
springboot + shiro 权限注解、请求乱码解决、统一异常处理

springboot + shiro 权限注解、请求乱码解决、统一异常处理 前篇 后台权限管理系统 相关: spring boot + mybatis + layui + shiro后台权限管理系统 springboot + shiro之登录人数限制、登录...

wyait ⋅ 06/06 ⋅ 0

Spring AOP 日志拦截器的事务管理

如果要在方法执行前或后或抛出异常后加上一个自己的拦截器,或者一个环绕拦截器,在拦截器中执行一些操作,比如执行一些数据库操作,记录一些信 息,这些操作通过调用一个服务类的方法来执行...

哲别0 ⋅ 05/18 ⋅ 0

Pig 1.0-BETA 发布,完善的 Spring Cloud 开发脚手框架

Hi 大家好! 我是pig开发团队的冷冷,经过4月迭代,400次提交,关闭issue 35 ,N个内测版本,我们将这个完善的微服务开发脚手架框架正式开放公测。 PIG是一个后端基于Spring Cloud、oAuth2....

冷冷gg ⋅ 04/24 ⋅ 0

基于 Spring Boot 的研发框架 - SOFABoot

SOFABoot 是蚂蚁金服开源的基于 Spring Boot 的研发框架,它在 Spring Boot 的基础上,提供了诸如 Readiness Check,类隔离,日志空间隔离等等能力。在增强了 Spring Boot 的同时,SOFABoot ...

匿名 ⋅ 04/19 ⋅ 1

Spring Boot 2.0.0参考手册_中文版_Part IV_23

文章作者:Tyan 博客:noahsnail.com | CSDN | 简书 Part IV. Spring Boot特性 这一部分进入Spring Boot细节部分。在这部分你会了解到你想使用和定制的一些重要特性。如果你还没准备好,你可...

quincuntial ⋅ 2016/11/17 ⋅ 0

java web项目的异常处理方式总结

方式一:service层的所有方法抛异常,最终交给SpringMVC的异常处理器处理【org.springframework.web.servlet.HandlerExceptionResolver】 (1)在spring-mvc.xml中配置全局异常处理 <!-- jso...

毅屺 ⋅ 2016/01/28 ⋅ 0

Spring Cloud--Honghu Cloud分布式微服务云系统—组件化

Spring Cloud集成项目有很多,下面我们列举一下和Spring Cloud相关的优秀项目,我们的企业架构中用到了很多的优秀项目,说白了,也是站在巨人的肩膀上去整合的。在学习Spring Cloud之前大家必...

itcloud ⋅ 04/26 ⋅ 0

基于SpringBoot,更简洁的后台管理系统--Guns

Guns 新版Guns基于SpringBoot全面升级,完美整合springmvc + shiro + mybatis-plus + beetl! 在不用写xml配置(V1.0)的基础上进一步简化项目配置,让您更专注于业务开发!抛弃传统spring xml的配...

naan1993 ⋅ 2017/05/18 ⋅ 69

基于Docker部署ELK (Elasticsearch, Logstash, Kibana)集中日志处理平台,及在Spring Boot应用

当我们还是单体部署我们的Spring Boot项目的时候,日志通常都是放在我们的Linux服务器目录,使用简单的Spring Boot已经包含的Logback框架即可实现。当我们基于Docker部署我们的分布式或者集群...

ImWiki ⋅ 05/27 ⋅ 0

baomidou/kaptcha-spring-boot-starter

kaptcha-spring-boot-starter 简介 kaptcha-spring-boot-starter 基于 springBoot2.0 和 Google Kaptcha 验证码组件,kaptcha-spring-boot-starter可以很方便的集成验证码到你的系统中。 如何...

baomidou ⋅ 05/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【elasticsearch】 随笔 Date datatype

一。时间类型的本质 首先json是没有时间类型的,对于es来说,时间类型的标示可以是下面三种情况 1.一个时间格式的字符串,如:"2014-11-27T08:05:32Z","2015-01-01" or "2015/01/01 12:10:3...

xiaomin0322 ⋅ 30分钟前 ⋅ 0

阿里云资源编排ROS使用教程

阿里云资源编排ROS详细内容: 阿里云资源编排ROS使用教程 资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、...

mcy0425 ⋅ 32分钟前 ⋅ 0

适配器设计模式

1、适配器模式 把一个类的接口变换成客户端所期待的另一种接口 使原本因接口不匹配而无法在一起工作的两个类能够在一起工作 分为类的适配器模式和对象的适配器模式 2、类适配器模式 类的适配...

职业搬砖20年 ⋅ 37分钟前 ⋅ 0

npm操作报错 _stream_writable.js:61

有一天 不知道什么原因(估计和node的版本有关),无论你做什么npm的操作 都会报错/usr/local/lib/node_modules/npm/node_modules/readable-stream/lib/_stream_writable.js:61 这时候只要执...

lilugirl ⋅ 40分钟前 ⋅ 0

Eclipse安装插件的几种方式

Eclipse魅力之一就是支持可扩展的插件,来丰富自身的功能,这种方式也是建立在开源思想之上的。具体使用什么方式去安装插件,要看我们拿到的是什么。 1. 拿到的是一串URL,如http://subclips...

GordonNemo ⋅ 43分钟前 ⋅ 0

div图片叠加

css实现代码如下: <div style="position: relative;"><!--这个层为外面的父层,需设置相对位置样式--> <div style="position: absolute;"><!--子层,需设置绝对位置样式--> <i......

niithub ⋅ 44分钟前 ⋅ 0

作用域slot

如果父组件需要使用子组件中的内容怎么办,比如父组件需要控制子组件的显示 <div id="root"><child><template slot-scope="props"><h1>{{props.item}} <div>编辑</div></h1><......

金于虎 ⋅ 47分钟前 ⋅ 1

HongHu commonservice-eureka 项目构建过程

上一篇我们回顾了关于 spring cloud eureka的相关基础知识,现在我们针对于HongHu cloud的eureka项目做以下构建,整个构建的过程很简单,我会将每一步都构建过程记录下来,希望可以帮助到大家...

明理萝 ⋅ 50分钟前 ⋅ 1

xml和对象的相互转化

@Data//setter和getter方法,toString和equals,hashcode方法@EqualsAndHashCode//代表重写equals和hashcode方法@XmlAccessorType(XmlAccessType.FIELD)public class Classroom {@X......

拐美人 ⋅ 50分钟前 ⋅ 0

tableView cell的高度 分组头部尾部的高度 自适应

@property (nonatomic) CGFloat rowHeight; // default is UITableViewAutomaticDimension@property (nonatomic) CGFloat sectionHeaderHeight; // default is UITableViewA......

娜一片蓝色星海 ⋅ 51分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部