统一后端返回格式以及统一后端异常处理

自定义后端返回格式ResultData

@Data
public class ResultData<T> {

    private int status;
    private String message;
    private T data;
    private long timestamp;

    public ResultData(){
        this.timestamp = System.currentTimeMillis();
    }

    public static <T> ResultData<T> success(T data){
        ResultData<T> resultData = new ResultData<>();
        resultData.setStatus(ReturnCode.RC200.getCode());
        resultData.setMessage(ReturnCode.RC200.getMessage());
        resultData.setData(data);
        return resultData;
    }

    public static <T> ResultData<T> fail(int code,String message){
        ResultData<T> resultData = new ResultData<>();
        resultData.setStatus(code);
        resultData.setMessage(message);
        return resultData;
    }
}

自定义后端返回消息和状态码ReturnCode

public enum ReturnCode {
    RC200(200,"操作成功"),
    RC400(400,"操作失败"),
    RC500(500,"系统异常,请稍后再试");
    
    private final int code;
    private final String message;

    ReturnCode(int code,String message){
        this.code = code;
        this.message = message;
    }

    public int getCode(){
        return code;
    }

    public String getMessage(){
        return message;
    }
}

实现ResponseBodyAdvice接口,添加@RestControllerAdvice注解,对返回数据进行处理

//允许在执行@ResponseBody或ResponseEntity控制器方法之后但在使用HttpMessageConverter编写主体之前自定义响应。
//对返回给前端的响应体进行预处理
@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {

    //是否支持advice功能
    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return true;
    }

    /*
     对返回的数据进行处理

     描述复制从接口:
        ResponseBodyAdvice 在选择HttpMessageConverter之后和调用其 write 方法之前调用。
     指定的:
        beforeBodyWrite在界面ResponseBodyAdvice里面
     参数:
         body – 要写入的正文
         returnType – 控制器方法的返回类型
         selectedContentType – 通过内容协商选择的内容类型
         selectedConverterType – 选择写入响应的转换器类型
         request – 当前请求
         response – 当前响应
     返回值:
        传入的主体或修改过的(可能是新的)实
     */
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        if (body instanceof ResultData){
            return body;
        }
        return ResultData.success(body);
    }
}

使用@RestControllerAdvice进行全局异常处理

@Slf4j
@RestControllerAdvice
public class RestExceptionHandler {

    //明确要处理的异常类型,与此对应的异常类型会执行此方法进行处理
    @ExceptionHandler(RuntimeException.class)
    //返回给前端的状态码
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ResultData<String> exception(Exception e){
        //出现异常后,服务器自身进行捕获,方便后期调试
        log.error("错误:{}",e.getMessage());
        //返回状态码以及错误信息
        return ResultData.fail(ReturnCode.RC500.getCode(), e.getMessage());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值