从零开始 Spring Boot 11:返回数据

本文介绍在Spring Boot中如何处理返回数据,包括改进返回值封装,使用拦截器将具体业务类型转化为统一格式,以及统一处理异常,通过示例代码展示了如何在接口中返回具体类型并确保前后端分离时的协同开发。
摘要由CSDN通过智能技术生成

从零开始 Spring Boot 11:返回数据

spring boot

图源:简书 (jianshu.com)

在之前文章中,已经展示了如何在前后端分离的Web应用中封装并返回统一格式的返回值,但之前展示的返回值封装的相当简单,只能用于简单示例,今天对返回值进行进一步封装和重构。

本篇文章会在从零开始 Spring Boot 9:Shiro - 魔芋红茶’s blog (icexmoon.cn)中最终代码的基础上进行修改。你可以从下面的链接获取对应的示例代码:

为了说明之前设计的一些缺陷,这里为这个示例代码添加上Swagger文档支持,具体方法见从零开始 Spring Boot 8:Swagger - 魔芋红茶’s blog (icexmoon.cn),这里不再详细说明。

因为这个示例程序使用Shiro做权限验证,所以需要将Swagger相关路径添加为例外,不经过Shiro验证:

        // 配置不会被拦截的链接 顺序判断
        map.put("/swagger-ui/**", "anon");
        map.put("/swagger-resources/**", "anon");
        map.put("/v3/api-docs/**", "anon");
        map.put("/static/**", "anon");

关于Shiro可以阅读从零开始 Spring Boot 9:Shiro - 魔芋红茶’s blog (icexmoon.cn)

现在查看Swagger你就会发现一个问题:

image-20220702203345411

所有接口的返回值都是String类型,所以无法通过Swagger文档查看具体的返回值格式,也就谈不上前后端分离开发时让前端通过Swagger文档来协同开发。

之所以这样,是因为我们在Controller中返回的是String类型:

    @RequiresRoles(value = {
   "guest", "manager"}, logical = Logical.OR)
    @GetMapping("/book")
    @ApiOperation("获取所有图书列表")
    public String listAllBooks() {
   
        Result result = new Result();
        List<Book> books = bookService.list();
        result.setData(books);
        return result.toString();
    }

Swagger正是通过展示Controller中方法的返回值类型来阐述具体接口的返回值格式。

所以,我们需要让接口能直接返回具体类型而非String

但是这样会产生另一个问题,如果返回的是具体的业务类型,那如何将其封装为统一的返回值格式?

其实可以利用Spring的拦截器来实现这点。

处理返回值

我们先看新封装的统一返回值类型:

package cn.icexmoon.demo.books.system.result;

import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
public class Result {
   
    public enum ErrorCode {
   
        SUCCESS(200, "成功"),
        DB_NO_DATA(500, "数据库数据缺失"),
        PARAM_CHECK(400, "没有通过参数校验"),
        LOGIN_ERROR(400, "登录失败"),

        NO_PRIORITY(401, "缺少操作的相关权限"),
        REQUEST_PARSE(402, "HTTP请求解析错误"),
        TIME_PARSE(403, "时间解析出错"),
        NEED_LOGIN(404, "需要登录"),
        DEFAULT_ERROR(501, "默认错误"),
        NETWORK_ERROR(502, "网络错误");

        private Integer code;
        private String desc;

        private ErrorCode(Integer code, String desc) {
   
            this.code = code;
            this.desc = desc;
        }

        public Integer getCode() {
   
            return code;
        }

        public String getDesc() {
   
            return desc;
        }

        @Override
        public String toString() {
   
            return this.code.toString();
        }
    }

    @ApiModelProperty("调用成功/失败"
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值