这里是对全局的异常统一处理加上全局统一管理了返回数据
这两块单个的案例写在前面的博客
统一异常处理链接: https://blog.csdn.net/weixin_43606226/article/details/103781770
全局统一管理返回数据链接: https://blog.csdn.net/weixin_43606226/article/details/103782596
1.RetResult.java(自定义返回数据的结构类)
@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
public class RetResult<T> {
private int code;
private String msg;
private T data;
public RetResult(int code,String msg,T data){
this.code=code;
this.msg=msg;
this.data=data;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
2.RetCode(枚举,一些常见状态)
public enum RetCode {
// 成功
SUCCESS(200),
// 失败
FAIL(202),
// 未认证(签名错误)
UNAUTHORIZED(401),
// 接口不存在
NOT_FOUND(404),
// 服务器内部错误
INTERNAL_SERVER_ERROR(500);
public int code;
RetCode(int code) {
this.code = code;
}
}
3.RetResponse.java(返回自定义的code,msg,data…等)
public class RetResponse {
//自定义message 失败信息
public static <T> RetResult<T> makeErrRsp(String message) {
return new RetResult<T>(202,message,null);
}
//自定义code,msg 返回数据
public static <T> RetResult<T> makeRsp(int code, String msg) {
return new RetResult<T>(code,msg,null);
}
//自定义code,msg,data 返回数据
public static <T> RetResult<T> makeRsp(int code, String msg, T data) {
return new RetResult<T>(code,msg,data);
}
}
4.RetException.java(返回的异常信息数据的结构类)
public class RetException {
private int code;
private String msg;
private String url;
public RetException(int code, String msg, String url) {
this.code = code;
this.msg = msg;
this.url = url;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
5.RetResultAdvice.java(全局统一返回数据处理+异常处理类)
@RestControllerAdvice
public class RetResultAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
return true;
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
if (o instanceof RetResult) {
return o;
}
//返回结果是String的时候需要做出处理,不然会报错
if(o instanceof String) {
return JSON.toJSONString(o);
}
//返回的数据若是异常返回信息,那么不做处理直接返回
if(o instanceof RetException)
{
return o;
}
return new RetResult(200,"success" , o);
}
//先捕获异常 然后再把数据返回到ResponseBody中,然后在Body中要返回数据的时候调用上面的拦截方法beforeBodyWrite()
@ExceptionHandler(value=Exception.class)
public Object handleException(Exception e, HttpServletRequest request) {
//此处返回json数据
//捕捉到的异常如果是自定义异常类,那么就返回自定义异常类中的错误码和错误信息
if (e instanceof MyException) {
return new RetException(((MyException) e).getCode(), ((MyException) e).getMsg(), request.getRequestURL().toString());
}
//这里是除了自定义异常的其他异常信息
else {
return new RetException(100, e.getMessage(), request.getRequestURL().toString());
}
}
}
至此,统一异常处理和统一管理返回数据整合完成。
这样的话返回数据可以自定义一个成功code 还有一个失败code 或者其他code 来表示请求接口的时候,请求的状态是否成功,在接口中出现了异常也可以被全局异常管理捕获然后返回在请求接口得到的数据中。
测试
自定义异常测试:
@RequestMapping("/myexception")
@ResponseBody
public void myexception(){
Random random=new Random();
int i=random.nextInt(10);
if(i==2){
return;
}else {
throw new MyException(204, "抛出了自定义异常");
}
}
结果:
带数据返回结果测试:
@RequestMapping(value = "/select/{openid}",method = RequestMethod.GET)
@ResponseBody
public User searchUser(@PathVariable String openid)
{
User user=userService.selectByOpenid(openid);
return user;
}
结果:
测试返回数据 自定义code,msg
@RequestMapping("/test")
@ResponseBody
public RetResult test(){
Random random=new Random();
int i=random.nextInt(10);
return RetResponse.makeRsp(208,"自定义msg");
}
结果: