统一返回对象和统一异常拦截

一、统一返回对象(第一种方式)

第一种写法

@Getter
@Setter
public class Results {
    // 返回状态标识
    private Integer code;
    // 返回数据
    private Object data;
    // 返回成功或失败的消息
    private String msg;

    // 成功返回数据
    public static Results success(Object data){
        Results results = new Results();
        results.setCode(200);
        results.setData(data);
        results.setMsg("");
        return results;
    }
    // 成功返回数据,返回消息
    public static Results success(Object data,String msg){
        Results results = new Results();
        results.setCode(200);
        results.setData(data);
        results.setMsg(msg);
        return results;
    }
    // 失败只返回消息
    public static Results fail(String msg){
        Results results = new Results();
        results.setCode(201);
        results.setData(null);
        results.setMsg(msg);
        return results;
    }
}

第二种写法

@Getter
@Setter
@AllArgsConstructor
public class Results {
    // 返回状态标识
    private Integer code;
    // 返回数据
    private Object data;
    // 返回成功或失败的消息
    private String msg;

    // 成功返回:数据
    public static Results success(Object data) {
        return success(200, data, "");
    }

    // 成功返回:数据、消息
    public static Results success(Object data, String msg) {
        return success(200, data, msg);
    }

    // 成功返回:自定义状态码、数据、消息
    public static Results success(Integer code, Object data, String msg) {
        return new Results(code, data, msg);
    }

    // 失败只返回:消息
    public static Results fail(String msg) {
        return fail(-1, null, msg);
    }

    // 失败返回:数据、消息
    public static Results fail(Object data, String msg) {
        return fail(-1, data, msg);
    }

    // 失败返回:自定义状态码、数据、消息
    public static Results fail(Integer code, Object data, String msg) {
        return new Results(code, data, msg);
    }
}

二、统一返回对象(第二种方式)

使用枚举来管理状态

// 定义状态统一字典管理
@Getter
public enum RHttpStateEnum {
    ORDER_CREATE_SUCCESS(200, "订单创建成功"),
    ORDER_CREATE_FAIL(201, "订单创建失败");

    private final int code;
    private final String msg;

    RHttpStateEnum(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    // 不生成set方法,因为ORDER_CREATE_SUCCESS已经把code,msg赋值了;没有必要去修改code、msg的值。
}
// 定义统一返回对象
@Getter
@Setter
@AllArgsConstructor
public class Results {
    // 返回状态标识
    private Integer code;
    // 返回数据
    private Object data;
    // 返回成功或失败的消息
    private String msg;

    // 成功返回数据
    public static Results success(Object data){
        return new Results(RHttpStateEnum.ORDER_CREATE_SUCCESS.getCode(), data,RHttpStateEnum.ORDER_CREATE_SUCCESS.getMsg());
    }
    // 成功返回数据,返回消息
    public static Results success(Object data,String msg){
        return new Results(RHttpStateEnum.ORDER_CREATE_SUCCESS.getCode(),data,msg);
    }
    // 失败只返回消息
    public static Results fail(RHttpStateEnum rHttpStateEnum){
        return new Results(rHttpStateEnum.getCode(), null,rHttpStateEnum.getMsg());
    }
}
// 调用失败返回消息
public static void main(String[] args) {
       Results.fail(RHttpStateEnum.ORDER_CREATE_FAIL);
}

三、拦截返回值统一处理(第三种方式)

拦截Controller方法的返回值,统一处理返回值到响应体中(ResponseBodyAdvice接口)

import com.bg.passcheckweb.utils.JacksonUtils;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

@ControllerAdvice("com.sywl.web.controller")// 配置扫描包
public class ResultsHandler implements ResponseBodyAdvice {
    // 是否支持advice功能,true支持
    @Override
    public boolean supports(MethodParameter methodParameter, Class aClass) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass,
     ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
    	//因为返回string类型会调用string的默认处理器直接返回,不会进行Results返回,所以要进行处理(转换成字符串)
        if (o instanceof String){
            return JacksonUtils.writeObjectAsString(Results.success(o));
        }
        return Results.success(o);
    }
}

返回失败,则直接抛出自定义异常,再配置一个统一异常拦截

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

// 统一异常拦截
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 
     * @param e 异常参数
     * @return 返回给前端的异常信息
     */
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public String error(Exception e) {
        e.printStackTrace();
        log.error(String.format("统一异常拦截:%s", e.getMessage()));
        return String.format("统一异常拦截:%s", e.getMessage());
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值