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

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

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

      
  

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

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());@Autowiredprivate 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();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 blocke.printStackTrace();throw e;} finally {result = null;if(out!=null) {out.close();}}}}

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部