使用@ControllerAdvice+@ExceptionHandler处理全局的异常

  • @ControllerAdvice注解将作用在所有注解了@RequestMapping的控制器的方法上
  • 如果单使用@ExceptionHandler,只能在当前Controller中处理异常。但当配合@ControllerAdvice一起使用的时候,就可以摆脱那个限制了

1、在xml配置中配置烧苗扫描

<context:component-scan base-package="com.sxit.pgc(扫描的包)" use-default-filters="false">  
           <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>  
           <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>  
</context:component-scan>  

注:扫描的包的路径如果不同可以用通配符配置,或者同时采用逗号和通配符配置

2、提供统一处理异常的类

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerExecutionChain;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

import com.sxit.pgCenter.module.account.entity.PgcAccount;
import com.sxit.pgCenter.module.demo.controller.SampleController;

import net.sf.json.JSONObject;

/**
 * 统一异常处理类
 * 
 */
@EnableWebMvc           
@ControllerAdvice
public class UnifyExceptionHandler {
	
	private Logger Logger = LoggerFactory.getLogger(this.getClass());
	
	@Autowired
	private RequestMappingHandlerMapping requestMappingHandlerMapping;
	
	private ModelAndView mv = null;
	@ExceptionHandler(value=Exception.class)
	public ModelAndView exceptionHandler(HttpServletRequest request, HttpServletResponse response, Object handler , Exception ex) throws Exception {

		HandlerExecutionChain handlerChain = requestMappingHandlerMapping.getHandler(request);
		HandlerMethod handlerMethod = (HandlerMethod) handlerChain.getHandler();
		
		String controllerName = handlerMethod.getBeanType().getName();
		controllerName = controllerName.substring(controllerName.lastIndexOf(".")+1);
		String methodName = handlerMethod.getMethod().getName();
		
		PgcAccount account = SystemKeys.getSessionUser(request.getSession());
        String userId = String.valueOf(account != null ? account.getId() : 1);

        String errorName = ex.getMessage();
//		String errorMsg = "\n"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date())+"用户"+userId+"在执行"+controllerName+"的方法"+methodName+"时, 发生异常"+errorName;
		String errorMsg = "\n用户"+userId+"在执行"+controllerName+"的方法"+methodName+"时, 发生异常"+errorName;
		String exStackTrace = "异常详情:" + ExceptionUtils.getStackTrace(ex);

		Logger.error(errorMsg + "\n" + exStackTrace);
		
		/*
		 * 判断是否是Ajax请求
		 */
		if("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
			
			Map rs = new HashMap<String, Object>();
			rs.put("msg", "exception");
			CommonUtil.printResult(request, response, JSONObject.fromObject(rs).toString());
			
		} else {
			request.setAttribute("exception", ex);
			mv = new ModelAndView("error");
		}
		return mv;
	}
	
}

import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 功能性共通类
 *
 */
public class CommonUtil {

	/**
	 * JSON字符串输出到前端
	 */
	public static void printResult(HttpServletRequest request, HttpServletResponse response, String result) throws Exception {
		
		PrintWriter out = null;
		try {
			out = response.getWriter();
			request.setCharacterEncoding("UTF-8");
			response.setContentType("text/html;charset=UTF-8");
			out.print(result);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw e;
		} finally {
			result = null;
			if(out!=null) {
				out.close();
			}
		}
		
	}
	
	
	
}

 


版权声明:本文为a990914093原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。