springboot统一处理返回实体与异常抛出_spring boot

当返回异常时,是这样子的

{
"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.异常的统一处理

  1. 自定义一个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;
}
}
  1. 定义一个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
}