0
点赞
收藏
分享

微信扫一扫

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

谁知我新 2022-05-03 阅读 51
java

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

第一种写法

@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 new Results(200,data,"");
    }
    // 成功返回数据,返回消息
    public static Results success(Object data,String msg){
        return new Results(200,data,msg);
    }
    // 失败只返回消息
    public static Results fail(String msg){
        return new Results(201,null,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 false;
    }

    @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 条评论