一、Response枚举
import lombok.Getter;
//返回结果枚举
@Getter
public enum ResponseEnum {
SUCESS(1000,"请求成功!"),
ERROR(9999,"请求失败!");
private int resultCode;
private String resultMsg;
ResponseEnum(int resultCode, String resultMsg) {
this.resultCode = resultCode;
this.resultMsg = resultMsg;
}
}
二、Response对象
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serializable;
@AllArgsConstructor
@Data
public class ResponseResult<T> implements Serializable {
private int code = 1000;
private String msg = "成功";
private T data;
// 私有构造器
private ResponseResult() {
}
// 通用成功
public static ResponseResult success() {
return success(null);
}
public static ResponseResult success(Object data) {
ResponseResult responseResult = new ResponseResult<>();
responseResult.setCode(ResponseEnum.SUCESS.getResultCode());
responseResult.setMsg(ResponseEnum.SUCESS.getResultMsg());
responseResult.setData(data);
return responseResult;
}
// 通用失败
public static ResponseResult error() {
return error(null);
}
public static ResponseResult error(Object data) {
ResponseResult responseResult = new ResponseResult<>();
responseResult.setCode(ResponseEnum.ERROR.getResultCode());
responseResult.setMsg(ResponseEnum.ERROR.getResultMsg());
responseResult.setData(data);
return responseResult;
}
// 自定义参数,链式编程
public ResponseResult data(T data) {
this.setData(data);
return this;
}
public ResponseResult code(int code) {
this.setCode(code);
return this;
}
public ResponseResult msg(String msg) {
this.setMsg(msg);
return this;
}
// 自定义返回数据
@Override
public String toString() {
return "RestResult{" +
"code=" + code +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
}
三、ResponseAdvice捕获controller返回的结果并包装
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
@ControllerAdvice(annotations = RestController.class)
public class MyResponseAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
// 判断是否要执行 beforeBodyWrite 方法, false不执行
// 也可以指定哪些方法进行处理
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
System.out.println("body===>"+body);
if (body instanceof ResponseResult) {
// 已经定义好了返回类型
return body;
} else if(body instanceof String) {
// 如果body是String需要单独处理
return JSON.toJSONString(ResponseResult.success(body));
} else {
return JSONObject.toJSON(ResponseResult.success(body));
}
}
}
四、异常处理
自定义异常
import lombok.Data;
@Data
public class MyException extends RuntimeException{
private int errCode;
// private String errMsg;
public MyException(String message, int errCode) {
super(message);
this.errCode = errCode;
}
@Override
public String toString() {
return "MyException{" +
"errCode=" + errCode +
"message=" + this.getMessage() +
'}';
}
}
捕获异常
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler(MyException.class)
@ResponseBody
public ResponseResult error(MyException e) {
e.printStackTrace();
return ResponseResult.error(e.getMessage()).code(e.getErrCode());
}
}
网友评论