在日常web开发中发生了异常,往往是需要通过一个统一的异常处理来保证客户端能够收到友好的提示。
一、默认异常机制
默认异常处理(SpringBoot 默认提供了两种机制,一种是针对于web浏览器访问的错误页面响应,另一种则是针对于 接口测试工具等 的参数响应处理):
原理:SpringBoot默认提供了程序出错的结果映射路径/error。这个/error请求会在BasicErrorController中处理,其内部是通过判断请求头中的Accept的内容是否为text/html来区分请求是来自客户端浏览器(浏览器通常默认自动发送请求头内容Accept:text/html)还是客户端接口的调用,以此来决定返回页面视图还是 JSON 消息内容。
二、自定义json格式异常响应
通过 @ControllerAdvice/@RestControllerAdvice 和 @ExceptionHandler 注解全局异常自定义响应类
首先定义响应状态码枚举类
public enum ResultCode { SUCCESS(200),//成功 FAIL(400),//失败 UNAUTHORIZED(401),//未认证(签名错误) NOT_FOUND(404),//接口不存在 INTERNAL_SERVER_ERROR(500);//服务器内部错误 private final int code; ResultCode(int code) { this.code = code; } public int code() { return code; } }
定义 响应类
public class Result { /** * 状态响应码 */ private int code; /** * 响应结果 成功/失败 */ private boolean success; /** * 响应信息 */ private String message; /** * 响应数据 */ @JsonInclude(JsonInclude.Include.NON_NULL) private Object data; public Result setCode(ResultCode resultCode) { this.code = resultCode.code(); return this; } public int getCode() { return code; } public boolean isSuccess() { return success; } public Result setSuccess(boolean success) { this.success = success; return this; } public String getMessage() { return message; } public Result setMessage(String message) { this.message = message; return this; } public Object getData() { return data; } public Result setData(Object data) { this.data = data; return this; } }
对响应结果封装,做预处理
public class ResultGenerator { private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS"; public static Result genSuccessResult() { return new Result() .setCode(ResultCode.SUCCESS) .setSuccess(true) .setMessage(DEFAULT_SUCCESS_MESSAGE); } public static Result genSuccessResult(Object data) { return new Result() .setCode(ResultCode.SUCCESS) .setSuccess(true) .setMessage(DEFAULT_SUCCESS_MESSAGE) .setData(data); } public static Result genFailResult(String message) { return new Result() .setCode(ResultCode.FAIL) .setSuccess(false) .setMessage(message); } }
异常处理类
@RestControllerAdvice public class ExceptionControllerAdvice { @ExceptionHandler(Exception.class) public Result jsonErrorHandler(HttpServletRequest req, Exception e){ return ResultGenerator.genFailResult(e.getMessage()); } }
三、自定义异常处理页面
在templates下新建error.html页面
做错误页面异常处理 返回 ModelAndView
@ExceptionHandler(Exception.class) public Object handleException(Exception e){ ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("msg", e.getMessage()); modelAndView.addObject("url", req.getRequestURL()); modelAndView.addObject("stackTrace", e.getStackTrace()); modelAndView.setViewName("error"); return modelAndView; }