1. 程式人生 > >spring mvc異常統一處理(實現HandlerExceptionResolver介面)不生效的問題解決

spring mvc異常統一處理(實現HandlerExceptionResolver介面)不生效的問題解決

spring mvc異常統一處理常見的有3種方式:

  1. 使用 @ ExceptionHandler 註解
  2. 實現 HandlerExceptionResolver 介面
  3. 使用 @controlleradvice 註解

詳細的使用方法可參考博文:https://blog.csdn.net/yjclsx/article/details/85230404

有一次在實現HandlerExceptionResolver介面的方式進行統一異常處理時,發現並沒有起作用,如下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @ClassName GlobalExceptionHandler
 * @Author jcyao
 * @Description
 * @Date 2018/12/24 9:47
 * @Version 1.0
 */
@Component
public class GlobalExceptionHandler implements HandlerExceptionResolver {

    private static final Logger logger = LoggerFactory.getLogger("SHIZAI_LOGGER");

    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        logger.error("統一異常處理捕獲了異常,請求地址:"+httpServletRequest.getRequestURL(),e);
        return null;
    }
}

在日誌中並沒有打印出異常捕獲的資訊。

最後在spring的bean配置檔案中加上了<bean>配置後,就可以了,如下:

<bean id="handlerExceptionResolver" class="com.dingtalk.isv.access.web.interceptor.GlobalExceptionHandler"/>

加上了<bean>配置,就不需要在異常處理類中加@Component註解了。

原因是springmvc從容器中取自定義異常處理器時是通過指定的id去取的,這個id預設是handlerExceptionResolver。