为了统一api的返回格式,方便前端接受返回数据,全局异常处理是个比较重要的功能,一般在项目里都会用到。
Springboot中的异常捕获通常分为三个阶段。
一:在进入Controller之前,如果请求一个不存在的地址,404错误等
/**
* @ClassName: FinalExceptionHandler
* @Description: 在进入Controller之前,譬如请求一个不存在的地址,404错误。
* @author shuyu.wang
* @date 2018年1月25日 下午3:03:11
* @version V1.0
*/
@RestController
public class FinalExceptionHandler implements ErrorController {
@Override
public String getErrorPath() {
return "/error";
}
@RequestMapping(value = "/error")
@ResponseBody
public ApiResult error(HttpServletResponse resp, HttpServletRequest req) {
// 错误处理逻辑
return new ApiResult(ResultCode.NO_URL.getCode(),ResultMessage.NO_URL.getMessage());
}
}
其中ApiResult是我自己定义的实体类,可以根据自己需要设置自己的返回类型。
二:在执行@RequestMapping时,进入逻辑处理阶段前。譬如传的参数类型错误。
/**
* @ClassName: GlobalExceptionHandler
* @Description: 在执行@RequestMapping时,进入逻辑处理阶段前。譬如传的参数类型错误
* @author shuyu.wang
* @date 2018年1月25日 下午3:12:16
* @version V1.0
*/
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler{
/**
* 在controller里面内容执行之前,校验一些参数不匹配啊,Get post方法不对啊之类的
*/
@Override
protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
return new ResponseEntity<Object>(new ApiResult(ResultCode.METHOD_NOT_ALLOWED.getCode(),ResultMessage.METHOD_NOT_ALLOWED.getMessage()), status);
}
}
其中ApiResult是我自己定义的实体类,可以根据自己需要设置自己的返回对象类型。
三:以上都正常时,在controller里执行逻辑代码时出的异常。譬如NullPointerException。
/**
* @ClassName: GlobalDefaultExceptionHandler
* @Description: 在controller里执行逻辑代码时出的异常
* @author shuyu.wang
* @date 2017年11月23日 上午9:45:16
* @version V1.0
*/
@ControllerAdvice
public class GlobalDefaultExceptionHandler {
private Logger logger = Logger.getLogger(GlobalDefaultExceptionHandler.class);
/**
* @Title: defaultErrorHandler
* @Description: 统一处理某一类异常,从而能够减少代码重复率和复杂度
* @param req
* @param e
* @return ApiResult
* @throws
*/
// @ExceptionHandler(value = ExceptionResult.class)//指定具体要处理的异常
@ExceptionHandler//处理所有异常
@ResponseBody
public ApiResult defaultErrorHandler(HttpServletRequest req, RuntimeException ex) {
// 打印异常信息:
ex.printStackTrace();
logger.error("捕获全局异常=="+ex);
return new ApiResult(ResultCode.SERVER_ERROR.getCode(),ResultMessage.SERVER_ERROR.getMessage(),ex.toString(),null);
}
/**
* 捕获类内所有的异常
*
* @param ex
* @return
*/
// @ExceptionHandler(value = Exception.class)
// public ModelAndView exceptionHandelByThymeleaf(Exception ex, HttpServletRequest req) {
// ModelAndView mav = new ModelAndView();
// mav.setViewName("error");
// mav.addObject("exception", ex.getMessage());
// mav.addObject("url", req.getRequestURL());
// return mav;
// }
}
其中ExceptionResult是我自己定义的异常类,可以直接使用基类Exception。
统一返回类型如下(根据你设置的ApiResult类不同而不同):
{
“code”: 500,
“message”: “服务器异常!”,
“data”: “java.lang.ArithmeticException: / by zero”,
“total”: null
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/15855.html