文档章节

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

问题达人
 问题达人
发布于 2016/07/15 17:08
字数 810
阅读 80
收藏 10
  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),在异常处理时不能获取除异常以外的数据。 

 

© 著作权归作者所有

共有 人打赏支持
问题达人
粉丝 12
博文 93
码字总数 86389
作品 0
昌平
程序员
私信 提问
Java程序员从笨鸟到菜鸟之(六十七)细谈Spring(一)spring简介

Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。 然而...

长平狐
2012/11/12
72
0
springboot + shiro 权限注解、请求乱码解决、统一异常处理

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

wyait
06/06
0
0
Spring AOP 的实现方式(以日志管理为例)

Spring AOP 的实现方式(以日志管理为例) 2016年10月08日 00:13:57 阅读数:23198 在学习Spring框架的历程中,最重要的是要理解Spring的IOC和AOP了,不但要学会怎么用,最好是知道它是怎么实...

Jeam_
07/04
0
0
基于SpringBoot,更简洁的后台管理系统 - Guns

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

stylefeng
2017/05/18
0
83
spring框架 AOP核心详解

AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子。 一 AOP的基本概念 (1)Aspec...

自古一人
08/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
2
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
3
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
7
0
MYSQL索引

索引的作用 索引类似书籍目录,查找数据,先查找目录,定位页码 性能影响 索引能大大减少查询数据时需要扫描的数据量,提高查询速度, 避免排序和使用临时表 将随机I/O变顺序I/O 降低写速度,占用磁...

关元
昨天
7
0
撬动世界的支点——《引爆点》读书笔记2900字优秀范文

撬动世界的支点——《引爆点》读书笔记2900字优秀范文: 作者:挽弓如月。因为加入火种协会的读书活动,最近我连续阅读了两本论述流行的大作,格拉德威尔的《引爆点》和乔纳伯杰的《疯传》。...

原创小博客
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部