- @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版权协议,转载请附上原文出处链接和本声明。