SpringMVC统一异常处理目的:
在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护
SpringMVC统一异常处理方法:
1.使用SimpleMappingExceptionResolver进行异常处理,
优点:具有集成简单、有良好的扩展性(可以任意增加自定义的异常和异常显示页面)、对已有代码没有入侵性等
缺点:该方法仅能获取到异常信息,若在出现异常时,对需要获取除异常以外的数据的情况不适用
2.@ExceptionHandler注释实现异常处理,对代码入侵性过大,不好维护。跳过
3.自定义全局异常处理器:springmvc提供一个HandlerExceptionResolver接口,自定义全局异常处理器必须要实现这个接口进行异常处理
优点:能获取导致异常出现的对象,有利于提供更详细的异常处理信息,这种用法比较多
自定义全局异常处理器HandlerExceptionResolver:
ChaException.java:
package com.cha.exception;
//定义一个简单的异常类
public class ChaException extends Exception {
//异常状态码+信息
public int code;
public String message;
public ChaException(int code,String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
ChaExceptionResolver.java
package com.cha.exception;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
public class ChaExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
ex.printStackTrace();
ChaException chaException = null;
//如果抛出的是系统自定义的异常则直接转换
if(ex instanceof ChaException) {
chaException = (ChaException) ex;
} else {
//如果抛出的不是系统自定义的异常则重新构造一个未知错误异常
chaException = new ChaException(999,"系统未知错误");
}
//向前台返回错误信息
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message",chaException.getMessage());
modelAndView.addObject("code",chaException.getCode());
modelAndView.setViewName("error/error.ftl");
return modelAndView;
}
}
spring-mvc.xml加上如下配置:
<!-- 自定义的全局异常处理器 只要实现HandlerExceptionResolver接口就是全局异常处理器 -->
<bean class="com.cha.exception.ChaExceptionResolver"></bean>
测试:
@RequestMapping("/Goods2")
public String toIndex2(HttpServletRequest request,ModelMap map) throws ChaException{
try {
int goodsId = Integer.parseInt(request.getParameter("id"));
Goods goods = this.goodsService.selectByPrimaryKey(goodsId);
System.out.println(goods.getGoodsName());
map.put("Hello", "java");
return "index.ftl";
} catch (Exception e) {
throw new ChaException(404,"找不到该商品");
}
}
异常页面:
<html>
<body>
<h1>${code!""}</h1>
<h1>${message!""}</h1>
<h1>400_error.ftl</h1>
</body>
</html>
正常结果:
异常结果: