首页 > 其他分享 >springboot学习之十一(统一返回结果)

springboot学习之十一(统一返回结果)

时间:2023-07-20 17:57:47浏览次数:52  
标签:返回 十一 code return springboot ResultData resultData msg public

SpringBoot统一返回结果
在实际开发中,为了降低开发人员之间的沟通成本,一般返回结果会定义成一个统一格式,具体的格式根据实际开发业务不同有所区别,但至少包括三要素:

code状态码:由后端统一定义各种返回结果的状态码
message 描述:本次接口调用的结果描述
data 数据:本次返回的数据。

{
    "code": 200,
    "msg": "操作成功",
    "data": "Hello World,test123",
}

 

1 基础实现方式

1.1 定义状态码

public enum ReturnCode {

    SUCCESS(200, "操作成功"),
    NEED_LOGIN(401, "需要登录后操作"),
    NO_OPERATOR_AUTH(403, "无权限操作"),
    TOKEN_ILL(404,"token非法"),
    SYSTEM_ERROR(500, "出现错误"),
    USERNAME_EXIST(501, "用户名已经存在"),
    PHOMENUMBER_EXIST(502, "手机号已存在"),
    EMAIL_EXIST(503, "邮箱已存在"),
    REQUEST_USERNAME(504, "必须填写用户名"),
    LOGIN_ERROR(505, "用户名或密码错误");

    // 自定义状态码
    private final int code;

    // 自定义描述
    private final String msg;

    ReturnCode(int code, String errorMessage) {
        this.code = code;
        this.msg = errorMessage;
    }

    public int getCode() {
        return this.code;
    }

    public String getMsg() {
        return this.msg;
    }

}

1.2 定义返回对象

@Data
public class ResultData<T> {
    /**
     * 响应编码
     */
    private Integer code;
    /**
     * 响应信息
     */
    private String msg;
    /**
     * 响应数据
     */
    private T data;
    /**
     * 接口请求时间
     */
    private long timestamp ;

    public ResultData(){
        this.timestamp = System.currentTimeMillis();
    }

    public ResultData(Integer code, String msg){
        this.code=code;
        this.msg=msg;
    }

    public ResultData(Integer code, String msg, T data){
        this.code=code;
        this.msg=msg;
        this.data=data;
    }

    public static ResultData success(){
        return ResultData.success(ReturnCode.SUCCESS.getCode(),ReturnCode.SUCCESS.getMsg());
    }
    public static ResultData success(int code, String msg){
        ResultData<Object> resultData = new ResultData<>();
        resultData.setCode(code);
        resultData.setMsg(msg);
        return resultData;
    }

    public static ResultData success(Object data){
        ResultData<Object> resultData = new ResultData<>(ReturnCode.SUCCESS.getCode(),ReturnCode.SUCCESS.getMsg());
        if (Objects.nonNull(data)){
            resultData.setData(data);
        }
        return resultData;
    }

    public static ResultData error(int code, String msg){
        ResultData<Object> resultData = new ResultData<>(code,msg);
        return resultData;
    }

    public static ResultData error(ReturnCode returnCode){
        ResultData<Object> resultData = new ResultData<>(returnCode.getCode(), returnCode.getMsg());
        return resultData;
    }
}

1.3 统一返回格式

    @GetMapping("/getTest")
    public ResultData<String> getTest(){
        return ResultData.success("Hello world!");
    }

返回结果如下所示:

{
    "code": 200,
    "msg": "操作成功",
    "data": "Hello world!",
    "timestamp": 1639013414924
}

到这里,一个统一格式的返回结果已经实现,接口的返回类型为ResultData,但每写一个接口,就要调用ResultData.success()对结果进行包装,重复劳动,浪费体力,所以这个在实际工作中一般用的比较少。

 

2 高级实现方式

我们只需要借助SpringBoot 提供的ResponseBodyAdvice即可。

ResponseBodyAdvice可以在注解@ResponseBody将返回值处理成相应格式之前操作返回值。实现这个接口即可完成相应操作。可用于对response 数据的一些统一封装或者加密等操作

**ResponseBodyAdvice的作用:**拦截Controller方法的返回值,统一处理返回值/响应体,一般用来统一返回格式,加解密,签名等等。

 

2.1 ResponseBodyAdvice返回

@RestControllerAdvice(basePackages = "org.tesheng.controller")
public class ResponseAdvice implements ResponseBodyAdvice {

    @Autowired
    private ObjectMapper objectMapper;
    
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    @SneakyThrows
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        
        if(body instanceof String){    // 如果Controller直接返回String的话,SpringBoot是直接返回,故我们需要手动转换成json。
            return objectMapper.writeValueAsString(ResultData.success(body));
        }
        if(body instanceof ResultData){    // 如果返回的结果是ResultData对象,直接返回即可。
            return body;
        }
        return ResultData.success(body);
    }
}

 

2.2 全局异常处理器

@Slf4j
@RestControllerAdvice
public class RestExceptionHandler {

    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ResultData<String> exception(Exception e){
        log.error("全局异常信息 ex={}", e.getMessage(), e);
        return ResultData.fail(ReturnCode.SYSTEM_ERROR.getCode(), e.getMessage());
    }
}

@RestControllerAdvice,RestController的增强类,可用于实现全局异常处理器
@ExceptionHandler,统一处理某一类异常,从而减少代码重复率和复杂度,比如要获取自定义异常可以 @ExceptionHandler(BusinessException.class)
@ResponseStatus指定客户端收到的http状态码

2.3 体验效果

    @GetMapping("/wrong")
    public int error(){
        int i = 9/0;
        return i;
    }

返回结果如下:

{
    "code": 500,
    "msg": "/ by zero",
    "data": null,
    "timestamp": 1639014045820
}

 

 

 


转:https://blog.csdn.net/asxyxxx/article/details/121806762

https://www.cnblogs.com/mxh-java/p/14319420.html

 

标签:返回,十一,code,return,springboot,ResultData,resultData,msg,public
From: https://www.cnblogs.com/fps2tao/p/17568811.html

相关文章

  • springboot i18n 国际化
    默认一:1、配置#主Springspring:messages:basename:i18n.rsltMessage,i18n.errorCodeMessage 2、多语言文件在resources下新建i18n文件夹 ,在在这个下面建立多语言:rsltMessage.propertiesrsltMessage_ar_SA.propertiesrsltMessage_en_US.propertiesrsltMe......
  • 在 asp.net core 的中间件中返回具体的页面
    前言#在asp.netcore中,存在着中间件这一概念,在中间件中,我们可以比过滤器更早的介入到http请求管道,从而实现对每一次的http请求、响应做切面处理,从而实现一些特殊的功能在使用中间件时,我们经常实现的是鉴权、请求日志记录、全局异常处理等等这种非业务性的需求,而如果你有......
  • Vue+springboot集成PageOffice实现在线编辑Word、excel文档
    说明:PageOffice是一款在线的office编辑软件,帮助Web应用系统或Web网站实现用户在线编辑Word、Excel、PowerPoint文档。可以完美实现在线公文流转,领导批阅,盖章。可以给文件添加水印,在线安全预览防止用户下载和复制文件等一、环境要求前端Vue项目:Node.js10及以上版本(当前集成方式......
  • Idea SpringBoot 项目启动时提示程序包不存在和找不到符号
    从git上克隆了一个SpringBoot项目,并且使用Maven编译也通过了,奇怪的是当BuildProject时却提示符号不存在。如下图: 先查看导入的类是否存在,如果不存在的话,那查看一下是否缺少了maven依赖。我这边是可以访问到类的,并且jar包也导入成功了。 也尝试了网上的解决方法,设置Proj......
  • MySQL中IF函数使用:字段A的返回值,根据字段B和C的条件来决定
     场景说明:车辆的位置信息是否返回,根据车辆位置的更新时间是否大于车辆的出站时间来决定;如果车辆位置的更新时间大于车辆的出站时间,则为有效的数据,直接返回经纬度数据;否则,视为无效的数据,直接返回NULL。下面是SQL语句的片段:-------------------------------------------------......
  • Spring + SpringMVC + SpringBoot + MyBatis 相关注解
    创建对象的:@Controller:放在类的上面,创建控制器对象,注入到容器中@RestController:放在类的上面,创建控制器对象,注入到容器中。作用:复合注解是@Controller,@ResponseBody,使用这个注解类的,里面的控制器方法的返回值都是数据@Service:放......
  • java怎么返回bigint
    Java如何返回BigInt在Java中,如果需要处理超过long类型范围的整数,可以使用BigInt类。BigInt类是Java提供的用于表示任意精度整数的类,它可以处理任意大小的整数,没有范围限制。在本文中,我将提供一个示例来解决一个具体的问题,即如何计算两个超大整数的乘积并返回BigInt类型的结果。问......
  • Springboot 整合Swagger Swagger使用教程
    swagger使用教程——快速使用swagger一、swagger简介官网:https://swagger.io/1、认识swaggerswagger是一个规范和完整的框架,用于生成、描述、调用和可视化RestFul风格的web服务,总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务......
  • springBoot——整合junit
    spring整合junit复习springBoot整合junitpackagecom.example.springboot_04;importcom.example.springboot_04.service.ServiceBook;importorg.junit.jupiter.api.Test;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot......
  • Day-4 返回值源码分析
    1.常见的返回类型HttpResponse,redirect,render,JsonResponse1.1HttpResponse  前置知识点 ......