最近在項目中發現Controller層的很多接口都是先打日誌再拋出異常,於是想到使用mvc提供的異常統一處理方法來減少打印日誌的代碼。查詢發現已有使用@ControllerAdvice + @ExceptionHandler註解的異常處理類,但並不生效,打斷點也進不去。網上查詢資料說可能缺少<mvc:annotation-driven>、已有其它方式異常處理機制等,後來發現那個類前面沒有識別爲bean的綠色圖標,原來掃描類時漏過了這個文件夾。
主要有以下幾種方式:
1、使用HandlerExceptionResolver接口
//HandlerExceptionResolver接口方式
public class ExceptionTest implements HandlerExceptionResolver{
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
return null;
}
}
2、使用@ControllerAdvice + @ExceptionHandler註解
//註解方式
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
String handleException(){
return "Exception Deal!";
}
}
3、配置文件中配置
<!-- Spring MVC提供的簡單異常處理器SimpleMappingExceptionResolver-全局異常配置 start -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 默認的錯誤信息頁面 -->
<property name="defaultErrorView" value="error"/>
<property name="exceptionMappings">
<props>
<prop key="java.lang.NullPointerException">commons/error/error_spring_null</prop>
<prop key="java.lang.ArithmeticException">commons/error/error_spring_math</prop>
</props>
</property>
</bean>
<!-- 全局異常配置 end -->