美文网首页Java 杂谈程序员
SprnigMVC的统一异常处理

SprnigMVC的统一异常处理

作者: 雁归来兮 | 来源:发表于2018-02-27 08:53 被阅读0次

    我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。这篇博文主要总结一下SpringMVC中如何统一处理异常。

    其中实现的方法分别包括以下:

    序号 实现方式 备注
    1 实现SimpleMapperExceptionResolver 配置文件中配置
    2 实现HandleExceptionResolver接口 配置实现装配bena
    3 @ExceptionHandler注解 侵入式代理,不建议使用

    装配SimpleMapperHandlerResolver对象

    在spring-mvc的配置文件中,配置该对象即可,具体信息请 参考注释

        <!--配置SpringMVC异常处理页面-->
        <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <!--当发生异常的时候,跳转到此URL-->
            <property name="defaultErrorView" value="/error/default"/>
            <!--传入的参数名称为ex-->
            <property name="exceptionAttribute" value="ex"/>
            <!--自定义异常页面-->
            <!--根据发生的异常来分别处理-->
            <property name="exceptionMappings">
                <props>
                    <prop key="com.tao.spring.exception.DataValidateException">/error/datavalidate</prop>
                </props>
            </property>
        </bean>
    

    其中DataValidateException是自定义的异常类,其代码如下

    public class DataValidateException extends RuntimeException {
    
        private String message;
        
        public DataValidateException(String message) {
            super(message);
        }
    
        @Override
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    }
    

    然后在Controller层或者Service层,以及DAO层来尝试抛出异常,可查看是否跳转到异常处理页面

    实现HandlerExceptionResolver接口

    实现此接口,需要实现相应的方法,在此代码中可以判断抛出的异常类型,来实现自定义异常处理,如下

    public class CustomHandleExceptionResolver implements HandlerExceptionResolver {
    
        public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
            if (ex instanceof DataValidateException) {
                System.out.println("发生了自定义异常");
            }
            if (ex instanceof NullPointerException){
                System.out.println("发生了空指针异常");
            }
            
            ModelAndView modelAndView=new ModelAndView();
            return modelAndView;
        }
    }
    

    使用@ExceptionHandler注解

    首先写个BaseController类,并在类中使用@ExceptionHandler注解声明异常处理的方法,如:

    public class BaseController { 
        @ExceptionHandler  
        public String exp(HttpServletRequest request, Exception ex) { 
        //TODO 异常处理
        }
    }
    

    然后将所有需要异常处理的Controller都继承这个BaseController,虽然从执行来看,不需要配置什么东西,但是代码有侵入性,需要异常处理的Controller都要继承它才行。在以后的修改,远远不如使用配置文件来得方便。

    参考文档:http://blog.csdn.net/eson_15/article/details/51731567

    相关文章

      网友评论

        本文标题:SprnigMVC的统一异常处理

        本文链接:https://www.haomeiwen.com/subject/zuhpxftx.html