目前很多公司开发时候都是前后端分离,后台给前端如果能返回一个统一的格式,统一接口报文格式,开发效率都会大大提升。
定义一个通用返回结果Result类
public class Result<T> {
private boolean success = true;
private String errorCode = "0";
private String errorMsg = null;
private List<T> data = new ArrayList<>();
public Result() {
}
public Result(List<T> data) {
if (data != null && data.size() > 0) {
this.data = data;
}
}
public Result(T data) {
this.data.add(data);
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
public List<T> getData() {
return data;
}
public void setData(List<T> data) {
this.data = data;
}
@Override
public String toString() {
return "Result{" +
"success=" + success +
", errorCode='" + errorCode + '\'' +
", errorMsg='" + errorMsg + '\'' +
", data=" + data +
'}';
}
}
异常类与异常枚举类
public enum MyExceptionEnum {
REQUESTPARAM_NOTNULL("A001", "请求参数不能为空"),
SYSTEM_ERROR("-1", "系统异常"),
DATASOURCE_ERROR("-2", "数据库异常"),
OTHER_ERROR("-3", "未知异常");
private String code;
private String msg;
MyExceptionEnum(String code, String msg) {
this.code = code;
this.msg = msg;
}
public String getCode() {
return code;
}
public String getMsg() {
return msg;
}
public static MyExceptionEnum getByCode(String code) {
if (StringUtils.isEmpty(code)) {
return null;
} else {
MyExceptionEnum[] var1 = values();
int var2 = var1.length;
for(int var3 = 0; var3 < var2; ++var3) {
MyExceptionEnum errorEnum = var1[var3];
if (errorEnum.getCode().equals(code)) {
return errorEnum;
}
}
return null;
}
}
}
public class MyException extends RuntimeException{
private String errorCode;
private String errorMsg;
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
public MyException(String errorCode, String errorMsg) {
super(errorMsg);
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
public MyException(String errorCode, String errorMsg, String description) {
super(errorMsg + description);
this.errorCode = errorCode;
this.errorMsg = errorMsg + description;
}
public MyException(MyExceptionEnum myExceptionEnum) {
super(myExceptionEnum.getMsg());
this.errorCode = myExceptionEnum.getCode();
this.errorMsg = myExceptionEnum.getMsg();
}
public MyException(MyExceptionEnum myExceptionEnum, String description) {
super(myExceptionEnum.getMsg() + description);
this.errorCode = myExceptionEnum.getCode();
this.errorMsg = myExceptionEnum.getMsg() + description;
}
}
全局异常处理
@RestControllerAdvice
public class MyExceptionHandler {
private Logger logger = LoggerFactory.getLogger(getClass());
@ExceptionHandler(Exception.class)
public Object handleException(Exception e, HttpServletRequest request, HttpServletResponse response){
logger.error("请求:{}发生异常:{}", request.getRequestURI(), e);
Result result = new Result();
result.setSuccess(false);
if (e instanceof MyException) {
result.setErrorCode(((MyException) e).getErrorCode());
result.setErrorMsg(((MyException) e).getErrorMsg());
} else {
result.setErrorCode(MyExceptionEnum.SYSTEM_ERROR.getCode());
result.setErrorMsg(MyExceptionEnum.SYSTEM_ERROR.getMsg());
}
return result;
}
}
Controller抛出自定义异常
@RequestMapping(
value = "test",
method = RequestMethod.POST)
public FrogTest test(@RequestBody FrogTest bean) {
if (bean.getName() == null) {
throw new MyException(MyExceptionEnum.REQUESTPARAM_NOTNULL);
}
int i = 10/0;
return bean;
}
测试
请求bean中name不为null时,返回前端
{
"success": false,
"errorCode": "-1",
"errorMsg": "系统异常",
"data": []
}
查看日志信息
2018-09-21 10:57:10.041 ERROR 7460 --- [io-10050-exec-3] c.f.m.common.MyExceptionHandler : 请求:/frog-test/test发生异常:{}
java.lang.ArithmeticException: / by zero
at com.frog.mybatisplus.controller.FrogTestController.test(FrogTestController.java:77) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_152]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_152]
...
请求bean中name为null时
{
"success": false,
"errorCode": "A001",
"errorMsg": "请求参数不能为空",
"data": []
}