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

本文介绍了解决Spring MVC框架中@ControllerAdvice配置类未生效的问题。通过添加@EnableWebMvc注解或在Spring配置文件中加入<mvc:annotation-driven/>来启用全局异常处理。
摘要由CSDN通过智能技术生成

最近项目使用@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> 

这样就解决问题了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值