1、应用场景
如果和前端约定好使用固定的自定义格式返回参数,如下:
{
"code": 200,
"msg": "操作成功",
"data": {
"equipment": 55,
"code": 99,
"point": 2
}
}
但在运行时发现了异常,默认的异常返回格式如下:
{
"timestamp": "2019-09-16T08:22:58.463+0000",
"status": 500,
"error": "Internal Server Error",
"message": "条码已存在!",
"path": "/machine/molding"
}
我们希望以自定义的格式返回所有数据,那么就需要将异常进行拦截处理并统一返回。
2、自定义返回数据类
/**
* @ClassName: ReturnBody
* @Description: 自定义数据返回类
* @Author: WZH
* @Date: 2019/9/15 10:39
*/
public class ReturnBody {
private int code;
private String msg;
private Object data;
private ReturnBody() {
this.setCode(200);
this.setMsg("操作成功");
}
public int getCode() {
return this.code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return this.msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return this.data;
}
public void setData(Object data) {
this.data = data;
}
public static ReturnBody error(int code, String msg) {
ReturnBody r = new ReturnBody();
r.setCode(code);
r.setMsg(msg);
return r;
}
public static ReturnBody error(Exception ex) {
ReturnBody r = new ReturnBody();
r.setCode(500);
r.setMsg(ex.getMessage());
return r;
}
public static ReturnBody okMsg(String msg) {
ReturnBody r = new ReturnBody();
r.setMsg(msg);
return r;
}
public static ReturnBody okData(Object data) {
ReturnBody r = new ReturnBody();
r.setData(data);
return r;
}
public static ReturnBody ok() {
ReturnBody r = new ReturnBody();
return r;
}
}
3、自定义异常处理类
/**
* @ClassName: HandleException
* @Description: 自定义异常处理类
* @Author: WZH
* @Date: 2019/9/15 12:00
*/
public class HandleException extends RuntimeException{
private int code;
public HandleException(String msg) {
super(msg);
this.code = 501;
}
public HandleException(int status, Exception e) {
super(e);
this.code = 501;
this.code = status;
}
public HandleException(Exception e) {
super(e);
this.code = 501;
}
public void setStatus(int status) {
this.code = status;
}
}
4、在Controller目录下定义异常统一处理类
/**
* @ClassName: HandleException
* @Description: 异常统一处理类
* @Author: WZH
* @Date: 2019/9/15 12:00
*/
@RestControllerAdvice
public class JrsfControllerAdvice {
@ExceptionHandler(value = Exception.class)
public ReturnBody error(Exception ex){
return ReturnBody.error(ex);
}
@ExceptionHandler(value = HandleException.class)
public ReturnBody jrsfExceptionHandler(HandleException ex){
return ReturnBody.error(ex);
}
}
5、测试
在ServiceImpl中抛自定义异常
@Override
public Machine test(Machine machine) {
if(machine.getCode()==null){
throw new HandleException("异常!");
}
}
可看到返回如下:
{
"code": 500,
"msg": "异常!",
"data": null
}