SpringMVC统一异常处理

本文介绍了SpringMVC中三种异常处理方式:使用SimpleMappingExceptionResolver、自定义异常处理器及使用@ControllerAdvice。详细阐述了每种方式的具体实现过程及其配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring MVC异常处理方式主要有:
1、直接使用框架提供的简单异常处理器SimpleMappingExceptionResolver;
2、自定义异常处理器,实现HandlerExceptionResolver接口;
3、使用注解的方式实现一个专门用于处理异常的Controller——ExceptionHandler。

**第一种**SimpleMappingExceptionResolver是AbstractHandlerExceptionResolver的子类,也是实现了HandlerExceptionResolver接口。而AbstractHandlerExceptionResolver这个抽象类中的一些参数,可以在Spring上下文中配置一个exceptionResolver的异常处理类,同时进行诸如exceptionMappings、statusCodes、warnLogCategory、defaultStatusCode、defaultErrorView等配置,从而实现简单的异常处理的目的。

<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">    
         <property name="exceptionMappings">    
             <props>    
                 <prop key="java.lang.Exception">errors/error</prop>    
                 <prop key="java.lang.Throwable">errors/err</prop>    
             </props>    
         </property>    
         <property name="statusCodes">    
             <props>    
                 <prop key="errors/error">500</prop>    
                 <prop key="errors/404">404</prop>    
             </props>    
         </property>     
         <property name="warnLogCategory" value="WARN"></property>     
         <property name="defaultErrorView" value="errors/error"></property>
         <property name="defaultStatusCode" value="500"></property>    
</bean>

第二种自定义异常处理器,比第一种更加的灵活,可以自定义不同的异常,并且对不同的异常进行不同方式的处理。比如如何设置怎么样的返回码,转到什么页面,记录怎么样的日志,都可以进行特殊处理。具体实现方式也是首先在Spring上下文配置中,配置一个自定义异常处理类,如:

<!-- 异常拦截器 -->
<bean id="myExceptionResolver"
        class="com.nazir.web.interceptor.MyExceptionResolver" />

然后MyExceptionResolver实现HandlerExceptionResolver,并重写resolveException方法,下面是一个简单的例子:

public class MyExceptionResolver implements HandlerExceptionResolver {

        @Override
        public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
                Exception ex) {
            Map<String, Object> model = new HashMap<String, Object>();
            model.put("ex", ex);

            if (ex instanceof SignException) {
                logger.error("签名错误");
                model.put("code", -2);
                return new ModelAndView("error-sign", model);
            } else if (ex instanceof ParameterException) {
                model.put("code", -1);
                logger.error("参数错误");
                return new ModelAndView("error-parameter", model);
            } else {
                return new ModelAndView("error", model);
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值