首先,在我們的工程中新建BaseController父類,內容如下:
package com.ztesoft.zsmartcity.framework.exception;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.web.bind.annotation.ExceptionHandler;
/**
* 2015-11-06
*
* @author djw 統一異常處理,所有controler繼承此類
*/
public abstract class BaseController {
@ExceptionHandler
public String handleException(HttpServletRequest request,
HttpServletResponse response, Exception e) {
printException(e);// log4j打印錯誤級別堆棧日志信息,時間
// json格式的ajax請求
if (request.getHeader("accept").indexOf("application/json") > -1
|| (request.getHeader("X-Requested-With") != null && request
.getHeader("X-Requested-With")
.indexOf("XMLHttpRequest") > -1)) {
response.setStatus(500);
response.setContentType("application/json;charset=utf-8");
try {
PrintWriter writer = response.getWriter();
if (e instanceof RuntimeException) {// 運行時異常
writer.write("系統內部異常!");
} else {// 非運行時異常
writer.write(e.getMessage());// 此處待細化異常處理給提示 ???
}
writer.flush();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return null;
} else {// URL普通請求
if (e instanceof RuntimeException) {// 運行時異常
request.setAttribute("exceptionMessage", "系統內部異常!");
} else {
request.setAttribute("exceptionMessage", e.getMessage());// 此處待細化異常處理給顯示 ???
}
try {// 跳轉統一異常處理界面
request.getRequestDispatcher("../error.jsp").forward(
request, response);
} catch (ServletException | IOException e1) {
e1.printStackTrace();
}
return null;
}
}
public void printException(Exception e) {
StringWriter sw = null;
PrintWriter pw = null;
try {
sw = new StringWriter();
pw = new PrintWriter(sw);
// 將出錯的棧信息輸出到printWriter中
e.printStackTrace(pw);
pw.flush();
sw.flush();
} finally {
if (sw != null) {
try {
sw.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
if (pw != null) {
pw.close();
}
}
Logger.getLogger(BaseController.class).error(
new Date() + ":" + sw.toString());
}
}
所有controler類繼承此類實現異常統一處理;