接口统一返回包装类和异常处理

在以SpringBoot开发Restful接口时,统一返回方便前端进行开发和封装,以及出现时给出响应编码和信息,对接口返回内容统一封装。

目录:

 

 

1.Constants接口     

这个是定义的常量,这里的都是返回到前端的的code,其中200为成功

package com.xxxx.demo.common;

public interface Constants {
    String CODE_200 = "200"; //成功
    String CODE_401 = "401";  // 权限不足
    String CODE_400 = "400";  // 参数错误
    String CODE_500 = "500"; // 系统错误
    String CODE_600 = "600"; // 其他业务异常
}
Comstants

 

 

 2.Result类   

扔到前端响应的统一封装类,其中code等于200的时候为成功,这里定义了几个常见的异常类型,也可以自己按照需求定义

package com.xxxx.demo.common;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 接口统一返回包装类
 */
//返回信息类'
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
    private String code;//
    private String msg;
    private Object data;//通用的类型
    public static Result success() {//构造方法,成功
        return new Result(Constants.CODE_200, "", null);
    }

    public static Result success(Object data) {//构造方法,成功
        return new Result(Constants.CODE_200, "", data);
    }

    public static Result error(String code, String msg) {//构造方法,错误
        return new Result(code, msg, null);
    }

    public static Result error() {//构造方法,错误
        return new Result(Constants.CODE_500, "系统错误", null);
    }
}
Result

 

 

 这个时候就可以都往前端丢这个Result类型了

例一:

 

 这里在前端收到的信息是一个统一封装类,Result类型,这里的res.code=='200'的时候是成功的,然后这个数据是res.data

 

例二: 

再看看这个然后个人中心的时候按照用户id查询:

 

 然后前端的代码是这样的,数据是res.data,然后判断状态码是'200'的时候是成功的

 

 例三:这个加载页面的时候

 

 

 然后这个recorde和total就是这样的,例如这个返回的data是一个对象,然后调用里面的东西就是res.data.records和res.data.total

然后后端每一个返回的都是Result,前端每一个都要判断,code=='200'的时候就是正确的,返回正确的就是return Result(调用后端的方法);返回错误就是return Result(错误的code,调用的后端的方法)

这时后台的东西就是这样了:想要数据的话就是.data

 

 

3.异常处理和自定义异常

 

 

 

 然后这个GlobalExceptionHandler.class

package com.xxxx.demo.exception;

import com.xxxx.demo.common.Result;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 如果抛出的的是ServiceException,则调用该方法
     * @param se 业务异常
     * @return Result
     */
    @ExceptionHandler(ServiceException.class)
    @ResponseBody
    public Result handle(ServiceException se){
        return Result.error(se.getCode(), se.getMessage());
    }
}
GlobalExceptionHandler

 

 然后这个ServiceException.class

package com.xxxx.demo.exception;

import lombok.Getter;

/**
 * 自定义异常
 */
@Getter
public class ServiceException extends RuntimeException {
    private String code;

    public ServiceException(String code, String msg) {
        super(msg);
        this.code = code;
    }
}
ServiceException.class

 

 然后抛出一个异常的时候就可以这样了

try {
            one = getOne(queryWrapper); // 从数据库查询用户信息
        } catch (Exception e) {
            LOG.error(e);
            throw new ServiceException(Constants.CODE_500, "系统错误");//抛出一个异常
        }

 

 

posted @ 2023-01-19 23:56  lipu123  阅读(167)  评论(0编辑  收藏  举报