最近项目使用@ControllerAdvice 进行配置全局的异常处理,但出现了@ControllerAdvice配置的类无法起作用。下面是我的异常处理类
/**
*
*/
package com.vkl.hblw.common.exception;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
import com.vkl.hblw.common.constant.SystemInfo;
import com.vkl.hblw.common.exception.bean.ServiceException;
import com.vkl.hblw.service.exception.ExceptionService;
/**
* @author xcc
* 统一异常处理类,所有的异常处理均在此类中处理。
*/
@ControllerAdvice
public class GlobalExceptionHandler {
private static final Logger log = Logger.getLogger(GlobalExceptionHandler.class);
@Resource
private ExceptionService exceptionService;
public ModelAndView model(String errorPage){
ModelAndView mav = new ModelAndView(errorPage);
mav.addObject("title", "访问出错");
mav.addObject("message", "");
return mav;
}
@ExceptionHandler(ServiceException.class)
public ModelAndView serviceExceptionHandle(HttpServletRequest request, Exception ex){
log.error(SystemInfo.LOG_CODE_ERROR, ex);
return model("/error");
}
@ExceptionHandler(Exception.class)
public ModelAndView exceptionHandle(HttpServletRequest request, Exception ex){
log.error(SystemInfo.LOG_CODE_ERROR, ex);
exceptionService.insertYcxx(ex.getMessage(), "");
return model("/error");
}
}
代码是没有任何问题的,网上一大堆。但无法起作用肯定是spring没有启动它。然后我加了个@EnableWebMvc在类
GlobalExceptionHandler上就OK了,@EnableWebMvc is equivalent to <mvc:annotation-driven /> in XML。之前我的spring配置XML里是没有加
<mvc:annotation-driven />的,所以我在XML里面加了<mvc:annotation-driven />,<mvc:annotation-driven/>
相当于注册了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean,配置一些messageconverter。
即解决了@Controller注解的使用前提配置。所以我之前用的拦截器org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
也要替换掉,否则会起冲突。
拦截器使用下面的配置方式
<!--配置拦截器, 多个拦截器,顺序执行 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
<mvc:mapping path="/**" />
<bean class="com.vkl.hblw.setting.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
<mvc:interceptor>
<!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
<mvc:mapping path="/**" />
<bean class="com.vkl.hblw.setting.interceptor.UserLoginProtectInterceptor"></bean>
</mvc:interceptor>
<!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->
</mvc:interceptors>
这样就解决问题了。