栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring Boot 统一返回格式与统一异常处理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring Boot 统一返回格式与统一异常处理

        需求背景:这一天,前端 阿签 兴高采烈地来到公司,打卡后来到工位,打开电脑准备工作。昨天后端小伙伴刚提交了新的功能接口,又是联调接口的一天。原本兴致很高的 阿签 调着调着心里有点毛躁起来,这TM接口返回格式怎么和之前的接口又不一样,抛出异常时也是各种各样的。无疑增加 签哥 我的工作量吗?

为解决这一问题,对接口返回格式、异常进行了统一处理。

一、接口返回格式统一 (1)新建状态枚举类

        定义状态枚举类 StatusCodeEnum 。便于后续使用

package com.hy.globalexception.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;


@Getter
@AllArgsConstructor
public enum StatusCodeEnum {
    
    PARAMETER_ERROR(102, "参数错误"),
    SUCCESS(200, "请求成功"),
    GLOBAL_EXCEPTION(301, "统一异常处理"),
    FAIL(500, "请求失败"),
    ;

    
    private final Integer code;

    
    private final String type;
}
(2)新建 接口、异常返回格式公用封装类

        定义 ResultWrapper 返回格式公用封装类。 注:这里定义成泛型类。

package com.hy.globalexception.config;

import com.hy.globalexception.enums.StatusCodeEnum;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;


@Data
@Accessors(chain = true)
public class ResultWrapper implements Serializable {

    
    private Integer code;

    
    private String msg;

    
    private T data;

    
    public static  ResultWrapper successBuilder(T t){
        return new ResultWrapper()
                .setCode(StatusCodeEnum.SUCCESS.getCode())
                .setMsg(StatusCodeEnum.SUCCESS.getMsg())
                .setData(t);
    }

    
    public static   ResultWrapper failBuilder(T t){
        return new ResultWrapper()
                .setCode(StatusCodeEnum.FAIL.getCode())
                .setMsg(StatusCodeEnum.FAIL.getMsg())
                .setData(t);
    }


}
 (3)看一下效果

        1)新建一个controller进行测试

package com.hy.globalexception.controller;

import com.hy.globalexception.config.ResultWrapper;
import com.hy.globalexception.service.ExceptionTestService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;


@RestController
@RequestMapping("resultTest")
public class ResultTestController {

    @GetMapping
    public ResultWrapper find() {
        // 注:实际开发中业务不在这里写,这里主要是方便测试
        Map map = new HashMap<>();
        map.put("name", "百里守约");
        map.put("level", "T0");
        map.put("property", "射手");

        return ResultWrapper.successBuilder(map);
    }

}
 

运行项目,启动完成后,使用 postman 工具看一下效果。效果如下:

 

二、统一异常处理

注:这里使用到上述 接口返回格式统一 中的两个工具类。

 (1)新建控制层全局异常处理类

        新建控制层全局异常处理类 GlobalExceptionHandle 。

package com.hy.globalexception.config;

import com.hy.globalexception.enums.StatusCodeEnum;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;


@RestControllerAdvice
@SuppressWarnings("all")
public class GlobalExceptionHandle {

    @ExceptionHandler(RuntimeException.class)
    public ResultWrapper customException(RuntimeException e) {
        return new ResultWrapper()
                .setCode(StatusCodeEnum.GLOBAL_EXCEPTION.getCode())
                .setMsg(e.getMessage());
    }

}
 
 (2)新建参数校验异常统一异常类 

        新建参数校验异常统一异常类 ValidateHandler 。

package com.hy.globalexception.config;

import com.hy.globalexception.enums.StatusCodeEnum;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;


@ControllerAdvice
@SuppressWarnings("all")
public class ValidateHandler extends ResponseEntityExceptionHandler {

    @Override
    protected ResponseEntity handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
                                                                  HttpHeaders headers,
                                                                  HttpStatus status,
                                                                  WebRequest request) {
        final StringBuilder builder = new StringBuilder();
        for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) {
            final String message = fieldError.getDefaultMessage();
            builder.append(message);
            break;
        }
        return ResponseEntity.ok(new ResultWrapper()
                .setCode(StatusCodeEnum.PARAMETER_ERROR.getCode())
                .setMsg(builder.toString()));
    }
}
 
 (3)自定义 异常类 

        新建 自定义异常类 CustomException 。

package com.hy.globalexception.config;


public class CustomException extends RuntimeException{

    public CustomException(String msg){
        super(msg);
    }

}

以上三种异常类创建完成后,创建一个 controller 来看看具体效果。注:有service 层及其他的工具类,具体可参考源码。

package com.hy.globalexception.controller;

import com.hy.globalexception.config.ResultWrapper;
import com.hy.globalexception.service.ExceptionTestService;
import com.hy.globalexception.vo.ParamVo;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;


@RestController
@RequestMapping("exceptionTest")
public class ExceptionTestController {

    @Resource
    private ExceptionTestService exceptionTestService;

    @GetMapping
    public ResultWrapper find() {
        // 这里定义产生一个异常,让全局异常去捕获
        int i = 1/0;
        return ResultWrapper.successBuilder(null);
    }

    @PostMapping
    public ResultWrapper save() {
        // 异常定义在业务层。
        exceptionTestService.save();
        return ResultWrapper.successBuilder(null);
    }

    @PostMapping("custom")
    public ResultWrapper custom() {
        // 业务层 抛出一个 自定义异常
        exceptionTestService.custom();
        return ResultWrapper.successBuilder(null);
    }

    @PostMapping("validate")
    public ResultWrapper custom(@RequestBody @Valid ParamVo paramVo) {
        // ParamVo 中参数校验失败,抛出异常, 由 ValidateHandler 处理
        return ResultWrapper.successBuilder(null);
    }

}
 

效果图如下:

 

 

 以上就是整个 统一返回格式与统一异常处理 的过程,从此以后,阿签不在为接口感到心情烦躁,每一天都是美好的。

附源码地址:

GitHub - MEETYUKEE/global-exception: 统一接口返回格式、统一异常处理 demohttps://github.com/MEETYUKEE/global-exception.git

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号