美文网首页spring
SpringBoot统一封装Response

SpringBoot统一封装Response

作者: Alse | 来源:发表于2021-10-30 22:08 被阅读0次

一、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());
    }
}

相关文章

网友评论

    本文标题:SpringBoot统一封装Response

    本文链接:https://www.haomeiwen.com/subject/sssaaltx.html