前几天看了我们公司以为大牛写了一个Springmvc的异常统一处理的方法,觉得很厉害,想去学习了解一下。今天看了一下,发现其实是很简单的实现逻辑,特来记录。
因,我自己搭建的测试框架的SpringBoot,所以正好把两种都来记录下来。
Spring 版本
//继承SimpleMappingExceptionResolver类,重写他的doResolveException方法,
//在出现异常的时候,报错信息会走实现doResolveException的代码内容
public class ExceptionInterceptor extends SimpleMappingExceptionResolver {
private static final Logger log = Logger.getLogger(ExceptionInterceptor.class);
//编写重写类,在内部进行代码操作,如log。
//将报错信息冲洗组装到Model里面return时,会有Spring方法进行处理
@Override
protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception ex) {
ByteArrayOutputStream buf = new java.io.ByteArrayOutputStream();
ex.printStackTrace(new java.io.PrintWriter(buf, true));
ModelAndView resultMV = new ModelAndView();
String errorMsg = buf.toString();
log.error(errorMsg);
// log.error(ex.getLocalizedMessage(), ex);
resultMV.setViewName("500");
resultMV.addObject("errorMsg", errorMsg);
return resultMV;
}
}
这个时候并没有配置完毕,在某些场景,可能想要错误后,跳转到错误页面,或者对错误有更详细的分配,所以需要在配置文件中对此方法的注入进行修改
<bean id="exceptionResolver" class="com.zito.zitopay.admin.web.ExceptionInterceptor">
<property name="exceptionMappings">
<props>
<prop key="java.lang.SQLException">error</prop>
<prop key="java.lang.Exception">error</prop>
</props>
</property>
</bean>
Spring 配置方法二
在需要统一处理错误的Controller上加上@ControllerAdvice
在该Controller里面编写一个@ExceptionHandler方法如
@ExceptionHandler(Exception.class)
@ResponseBody
public String handleException(Exception e) {
return e.getMessage();
}
该Controller下如果出错,都会去执行handleException像如上方法就会直接返回报错信息或者你throw new Exception(“message”)里面手动抛出的异常错误
扫描二维码关注公众号,回复:
1918083 查看本文章
这样啊就配置好了
SpringBoot 版本
关于SpringBoot的统一异常处理就更简单了。SB提供了更简单注解方式@ControllerAdvice,简单得来说,就是Spring能扫描到这个包的时候,所有的异常处理会在这里面进行。就如他名字一样,所有对Controller的请求报错,会向上抛,到Controller层。在@ControllerAdvice类下进行对应的异常处理
@ControllerAdvice
public class GlobalexcptionHandler{
/**
* 全局处理Exception
* 错误的情况下返回500
* @param ex
* @param req
* @return
*/
@ExceptionHandler(value = {RuntimeException.class})
public ResponseEntity<Object> handleOtherExceptions(final RuntimeException ex, final WebRequest req) {
Map<String, String> map=new HashMap<String, String>();
map.put("Status", "500");
map.put("Path", req.toString());
map.put("ErrorMessage",ex.getMessage());
return new ResponseEntity<Object>(map,HttpStatus.OK);
}
}