Spring统一异常处理之@ControllerAdvice 无法使用问题

来源:互联网 发布:游戏程序员必看书籍 编辑:程序博客网 时间:2024/05/21 05:17

最近项目使用@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 * 统一异常处理类,所有的异常处理均在此类中处理。 */@ControllerAdvicepublic class GlobalExceptionHandler {private static final Logger log = Logger.getLogger(GlobalExceptionHandler.class);@Resourceprivate 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> 

这样就解决问题了。

阅读全文
0 0
原创粉丝点击