当返回异常时,是这样子的
{ "timestamp": "2019-12-11T05:37:10.096+0000", "status": 500, "error": "Internal Server Error", "message": "报错了", "path": "/test/testException" }
但是,可能有时前台需要一个code值来判断抛出的错误,这样就需要我们封装去返回code值和message值。同时还可以拦截异常进行输出,是市面架构的通用做法。下文将介绍如何统一处理返回实体与异常抛出。
1.自定义返回对象
1.定义一个返回实体类,如果不进行处理,直接输出200和成功码。在接口输出最外层都使用该实体,这样前端就能有规范的获取数据与信息值。
public enum CommonEnum { SC_SUCCESS(200, "成功"), SC_NO_JURISDICTION(401, "没有权限,请联系管理员授权"), SC_INTERNAL_SERVER_ERROR_500(500, "接口异常"); } public class Result<T> implements Serializable { /** * 返回编码 */ private Integer code = 200; /** * 返回信息 */ private String message = "操作成功"; /** * 返回数据 */ private T data; /** * 成功标志 */ private boolean success = true; public Result() { } public Result(Integer code, String Message) { this.code = code; this.message = Message; } public int getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMessage() { return this.message; } public void setMessage(String message) { this.message = message; } public T getData() { return data; } public void setData(T data) { this.data = data; } public void SetResult(Integer code, String msg, T data) { this.setMessage(msg); this.setData(data); this.setCode(code); } public static Result<Object> error(String msg) { return error(CommonEnum.SC_INTERNAL_SERVER_ERROR_500.getCode(), msg); } public static Result<Object> error(int code, String msg) { Result<Object> r = new Result<Object>(); r.setCode(code); r.setMessage(msg); return r; } }
2.异常的统一处理
- 自定义一个TemplateException ,需要继承Exception (或其他子类)。
public class TemplateException extends Exception { /** * 服务器状态码 */ private Integer code; /** * 错误信息 */ private String message; public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } @Override public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public TemplateException(String message) { this.message = message; } public TemplateException(Integer code, String message) { this.message = message; this.code = code; } }
- 定义一个ExceptionHandle,在异常时会进行逻辑处理。所以不需要在写try-catch了,直接在该类配置即可。
@RestControllerAdvice public class DemoExceptionHandler { private final static Logger logger = LoggerFactory.getLogger(DemoExceptionHandler.class); /** * 自定义异常处理 * * @param e * @return */ @ExceptionHandler(TemplateException.class) public Result<?> handleTemplateException(TemplateException e) { logger.info(e.getMessage()); e.printStackTrace(); return Result.error(e.getCode(), e.getMessage()); } /** * exception异常处理 * * @param e * @return */ @ExceptionHandler(Exception.class) public Result<?> handleException(Exception e) { logger.info(e.getMessage()); e.printStackTrace(); return Result.error("接口异常,错误信息为" + e.getMessage()); } /** * 权限异常 * * @param e * @return */ @ExceptionHandler({UnauthorizedException.class, AuthorizationException.class}) public Result<?> handleAuthorizationException(AuthorizationException e) { logger.info(e.getMessage()); e.printStackTrace(); return Result.error(CommonEnum.SC_NO_JURISDICTION.getCode(), CommonEnum.SC_NO_JURISDICTION.getMessage()); } }
这时候在抛出异常时,返回值为 。
{ "code": 10066, "status": 0, "msg": "报错了", "data": null }