SpringBoot统一返回数据格式和统一异常处理

目录

1. 统一返回数据格式

1.1 统一结果的一般形式

1.2 创建状态码接口类

1.3 创建统一结果类

1.4 控制层使用统一结果示例

2. 统一异常处理

2.1 自定义异常处理类

2.2 全局异常处理类

2.3  控制层使用统一异常处理示例


1. 统一返回数据格式

        目前的前后端开发大部分数据的传输格式都是json,因此定义一个统一规范的数据格式有利于前后端的交互与UI的展示。

1.1 统一结果的一般形式

  • 是否响应成功
  • 响应状态码
  • 状态码描述
  • 响应数据

1.2 创建状态码接口类

package com.miaxis.utils;
 
public interface ResultCode {
    /*成功状态码*/
    Integer SUCCESS = 20000;
    /*失败的状态码*/
    Integer ERROR = 20001;
}

1.3 创建统一结果类

  • 只可以调用统一结果类的方法,不可以直接创建;
  • 内置静态方法,返回对象;
  • 为便于自定义统一结果的信息,建议使用链式编程,将返回对象设类本身,即return this;
  • 响应数据由于为json格式,可定义为JsonObject或Map形式;
package com.miaxis.utils;
 
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
 
import java.util.HashMap;
import java.util.Map;
@Data
public class ResponseResult{
    private ResponseResult(){}
    @ApiModelProperty(value = "是否成功")
    private Boolean success;
    @ApiModelProperty(value = "状态码")
    private Integer code;
    @ApiModelProperty(value = "返回消息")
    private String message;
    @ApiModelProperty(value = "返回的数据")
    private Map<String,Object> data = new HashMap<>();
 
    /*提供工具方法*/
    public static ResponseResult ok(){
        ResponseResult responseResult = new ResponseResult();
        responseResult.setSuccess(true);
        responseResult.setCode(ResultCode.SUCCESS);
        responseResult.setMessage("成功");
        return responseResult;
    }
    public static ResponseResult error(){
        ResponseResult responseResult = new ResponseResult();
        responseResult.setSuccess(false);
        responseResult.setCode(ResultCode.ERROR);
        responseResult.setMessage("失败");
        return responseResult;
    }
    public ResponseResult success(Boolean success){
        this.setSuccess(success);
        return this;
    }
    public ResponseResult message(String message){
        this.setMessage(message);
        return this;
    }
    public ResponseResult code(Integer code){
        this.setCode(code);
        return  this;
    }
    public ResponseResult data(String key,Object value){
        this.data.put(key,value);
        return this;
    }
    public ResponseResult data(Map<String,Object> map){
        this.setData(map);
        return this;
    }
}

1.4 控制层使用统一结果示例

@RestController
@RequestMapping("/mybatis/user")
public class UserController {
    /*使用代码生成器生成的service当中已经有很多的基础服务 ,直接调用即可*/
    @Autowired
    private UserService userService;
 
    @GetMapping("/getUserList")
    public ResponseResult getUserList(){
        List<User> list = userService.list(null);
        return ResponseResult.ok().data("list",list);
    }
}

        json结果

2. 统一异常处理

        使用统一返回结果时,还有一种情况,就是程序的保存是由于运行时异常导致的结果,有些异常我们无法提前预知,不能正常走到我们return的ResponseResult对象返回。

        因此,需要定义一个统一的全局异常来捕获这些信息,并作为一种结果返回控制层。

        @ControllerAdvice

        该注解为统一异常处理的核心,是一种作用于控制层的切面通知(Advice),该注解能够将通用的@ExceptionHandler、@InitBinder和@ModelAttributes方法收集到一个类型,并应用到所有控制器上。

        该类中的设计思路

  • 使用@ExceptionHandler注解捕获指定或自定义的异常;
  • 使用@ControllerAdvice集成@ExceptionHandler的方法到一个类中;
  • 必须定义一个通用的异常捕获方法,便于捕获未定义的异常信息;
  • 自定一个异常类,捕获针对项目或业务的异常;
  • 异常的对象信息补充到统一结果枚举中;

2.1 自定义异常处理类

package com.miaxis.exception;
 
import lombok.AllArgsConstructor;
import lombok.Data;
 
@Data
@AllArgsConstructor  //生成带参数的构造器
public class CustomException extends RuntimeException{
    private Integer code;
    private String msg;
}

2.2 全局异常处理类

package com.miaxis.exception;

import com.miaxis.utils.ResponseResult;
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 {
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ResponseResult error(Exception e){
        e.printStackTrace();
        return ResponseResult.error().message(e.getMessage());
    }

    //自定义异常
    @ExceptionHandler(CustomException.class)
    @ResponseBody //返回json数据
    public ResponseResult error(CustomException e){
        e.printStackTrace();
        return ResponseResult.error().code(e.getCode()).message(e.getMsg());
    }
}

2.3  控制层使用统一异常处理示例

@RestController
@RequestMapping("/mybatis/user")
public class UserController {
    /*使用代码生成器生成的service当中已经有很多的基础服务 ,直接调用即可*/
    @Autowired
    private UserService userService;
 
    @GetMapping("/getUserList")
    public ResponseResult getUserList(){
        float t = 1/0;  //测试异常情况
        List<User> list = userService.list(null);
        return ResponseResult.ok().data("list",list);
    }
}

        json结果

  • 19
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值