最近在项目中发现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 -->