全局异常处理是个比较重要的功能,一般在项目里都会用到,这篇文章主要给大家介绍了关于SpringBoot中如何统一接口返回与全局异常处理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
背景
在分布式、微服务盛行的今天,绝大部分项目都采用的微服务框架,前后端分离方式。前端和后端进行交互,前端按照约定请求URL路径,并传入相关参数,后端服务器接收请求,进行业务处理,返回数据给前端。维护一套完善且规范的接口是非常有必要的, 这样不仅能够提高对接效率,也可以让我的代码看起来更加简洁优雅。
使用统一返回结果时,还有一种情况,就是程序的报错是由于运行时异常导致的结果,有些异常是我们在业务中抛出的,有些是无法提前预知。
因此,我们需要定义一个统一的全局异常,在Controller捕获所有异常,并且做适当处理,并作为一种结果返回。
统一接口返回
定义API返回码枚举类
public enum ResultCode { /* 成功状态码 */ SUCCESS(200, "成功"), /* 错误状态码 */ NOT_FOUND(404, "请求的资源不存在"), INTERNAL_ERROR(500, "服务器内部错误"), PARAMETER_EXCEPTION(501, "请求参数校验异常"), /* 业务状态码 */ <strong style="color:transparent">来源gao@daima#com搞(%代@#码网</strong> USER_NOT_EXIST_ERROR(10001, "用户不存在"), ; private Integer code; private String message; public Integer code() { return this.code; } public String message() { return this.message; } ResultCode(Integer code, String message) { this.code = code; this.message = message; } }
定义正常响应的API统一返回体
@Data public class Result implements Serializable { private Integer code; private String message; private boolean success = true; private T data; @JsonIgnore private ResultCode resultCode; private Result() { } public void setResultCode(ResultCode resultCode) { this.resultCode = resultCode; this.code = resultCode.code(); this.message = resultCode.message(); } public Result(ResultCode resultCode, T data) { this.code = resultCode.code(); this.message = resultCode.message(); this.data = data; } public static Result success() { Result result = new Result(); result.setResultCode(ResultCode.SUCCESS); return result; } public static Result success(T data) { Result result = new Result(); result.setResultCode(ResultCode.SUCCESS); result.setData(data); return result; } }
定义异常响应的API统一返回体
@Data public class ErrorResult implements Serializable { private Integer code; private String message; private boolean success = false; @JsonIgnore private ResultCode resultCode; public static ErrorResult error() { ErrorResult result = new ErrorResult(); result.setResultCode(ResultCode.INTERNAL_ERROR); return result; } public static ErrorResult error(String message) { ErrorResult result = new ErrorResult(); result.setCode(ResultCode.INTERNAL_ERROR.code()); result.setMessage(message); return result; } public static ErrorResult error(Integer code, String message) { ErrorResult result = new ErrorResult(); result.setCode(code); result.setMessage(message); return result; } public static ErrorResult error(ResultCode resultCode, String message) { ErrorResult result = new ErrorResult(); result.setResultCode(resultCode); result.setMessage(message) return result; } }
编写包装返回结果的自定义注解
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD}) //作用于方法和类(接口)上 @Documented public @interface ResponseResult { }
定义返回结果拦截器
@Component public class ResponseResultInterceptor implements HandlerInterceptor { /* 使用统一返回体的标识 */ private static final String RESPONSE_RESULT_ANNOTATION = "RESPONSE-RESULT-ANNOTATION"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object以上就是SpringBoot中如何统一接口返回与全局异常处理详解的详细内容,更多请关注gaodaima搞代码网其它相关文章!