Spring MVC 在處理請求過程中,出現異常信息交給異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。
系統的DAO(Mapper), Service, Controller出現異常都通過throws Exception向上拋出,最后由Spring MVC前端控制器交給異常處理器進行處理。

1. 編寫異常處理類(處理普通請求和ajax請求)。
~~~
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
public class GlobalExceptionResolver implements HandlerExceptionResolver{
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionResolver.class);
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object arg2,
Exception ex) {
// logger.info("系統發生異常");
logger.error("系統發生異常",ex);
if (!(request.getHeader("accept").indexOf("application/json") > -1 || (request
.getHeader("X-Requested-With")!= null && request
.getHeader("X-Requested-With").indexOf("XMLHttpRequest") > -1))) {
// 如果不是異步請求
ModelAndView mav = new ModelAndView();
mav.setViewName("/globalerror.html");
return mav;
} else {// JSON格式返回
try {
PrintWriter writer = response.getWriter();
writer.write(ex.getMessage());
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
}
~~~
2. 在springmvc.xml中配置異常處理器
~~~
<!-- 全局異常處理 -->
<bean class="com.neusoft.control.GlobalExceptionResolver"></bean>
~~~
3. 日志說明
使用slf4j實現日志處理,slf4j內部調用log4j。
需要以下幾個jar包

在maven環境下,配置依賴:
~~~
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<!-- <scope>test</scope> -->
</dependency>
~~~
配置log4j.properties(放在classpath根路徑下)
~~~
log4j.rootLogger = INFO,stdout,E
### Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%p] [%l] %10.10c -%m%n
log4j.appender.E = org.apache.log4j.RollingFileAppender
log4j.appender.E.File =D:/logs/error.log
log4j.appender.E.MaxFileSize =1024KB
log4j.appender.E.MaxBackupIndex =10
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern =\n\n[%-5p] %d{yyyy-MM-dd HH\:mm\:ss,SSS}
~~~
4. Ajax說明
Ajax提交如果出現錯誤,會返回錯誤信息,要在error方法中捕獲。例如:
~~~
$.ajax({
url:"test/addemp",
type:"post",
data:{ename:ename,job:job,sal:sal,deptno:deptno},
dataType:"json",
success:function(data)
{
//console.log(data);
if(data.result)
{
alert("保存成功");
}
else
{
alert("保存失敗");
}
},
error:function(err)
{
alert("操作失敗");
console.log(err);
}
});
~~~