基于SpringBoot封装通用返回结果类

为了规范返回结果,保证返回结果风格统一,提高编码效率与前端调试效率,封装通用返回结果类、通用分页结果类。
本文还提供了简单的使用示例和源代码。
2023-12-29 更新:解决Raw use of parameterized class 'BaseResult' 问题

系列文章指路👉

系列文章-基于SpringBoot3创建项目并配置常用的工具和一些常用的类

1. 封装结果枚举

使用了Lombok,可以根据业务自由扩展

@Getter
public enum ResultEnum {
    SUCCESS(200,"请求成功"),
    FAILED(300, "请求失败");

    public final int code;
    public final String message;

    ResultEnum(int code, String message){
        this.code=code;
        this.message=message;
    }
}

2. 封装通用的返回结果

源代码见文末 BaseResult

结构

返回结果包含int codeString messageT data

构造方法

  • 仅返回编码和消息,不附加数据: public BaseResult(int code, String message)
  • 使用枚举,不附加数据:public BaseResult(ResultEnum resultEnum)
  • 返回编码和消息,附加数据:public BaseResult(int code, String message, T data)
  • 使用枚举,附加数据:public BaseResult(ResultEnum resultEnum, T data)

常用的静态方法

使用上述的构造方法可以满足100%需求,除此之外提供一些常用的静态方法,简化代码,提高开发效率。
📢对于静态方法覆盖不到的返回方式(例如既返回失败信息又想附带数据),可以使用构造方法,也可以根据业务使用频率扩展静态方法。

成功的操作通常分为两种:

  • 仅返回成功枚举中的code和message,不附带数据的,例如:修改成功、上架成功等: public static BaseResult<?> success()
  • 附带结果集,例如:列表查询、单条查询等:public static <T> BaseResult<T> success(T data)

失败的操作:

  • 仅返回失败枚举中的code和message:public static BaseResult<?> fail()
  • 多数情况下,需要将失败信息返回,提示失败原因:public static BaseResult<T> fail(String message)

2023-12-29更新:解决 Raw use of parameterized class 'BaseResult' 问题

使用目前的静态方法:会报错: Raw use of parameterized class 'BaseResult'
在这里插入图片描述
如果指定具体的类型,又报错:提供的类型和需要的类型不一致,需要强转。
在这里插入图片描述
如图:
在这里插入图片描述

也就是说,不管怎么怎么使用这个静态方法总会有一个warning,对强迫症程序员来说极不友好。
我们使用 Class<T> clazz 解决此问题,新增一个成功的重载静态函数:

    public static <T> BaseResult<T> success(Class<T> clazz) {
        return new BaseResult<>(ResultEnum.SUCCESS);
    }

现在再调用就解决了这个warning:
在这里插入图片描述
其实这样使用起来,跟使用构造函数new BaseResult<>(ResultEnum.SUCCESS)差不多。
因此本方法仅供参考,是否使用自行权衡。

3. 封装通用分页结果

源代码见文末 PageResult

结构

总记录数long total,当前页数据列表T records

使用

前端传入{offset、limit}或者{pageNum、pageSize}二者任选。
后端组织分页结果后放入通用的结果中。

    @GetMapping("/pageQuery")
    @Operation(summary = "pageQuery", description = "分页查询")
    public Object pageQuery(@RequestParam(defaultValue = "0", value = "offset") int offset,
                            @RequestParam(defaultValue = "10", value = "limit") int limit) {
        PageHelper.offsetPage(offset,limit);
        List<Fruit> fruits = fruitService.list();
        PageInfo<Fruit> page = new PageInfo<>(fruits);
        PageResult<List<Fruit>> pageRes = new PageResult<>(page.getTotal(), fruits);
        return BaseResult.success(pageRes);
    }

4. 源码:

BaseResult

package com.ya.boottest.utils.result;

import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.Data;

/**
 * <p>created time:2023/6/10 15:42</p>
 * <p>des:
 * 通用返回结果
 * </p>
 *
 * @author Ya Shi
 */
@Tag(name = "BaseResult", description = "通用返回结果")
@Data
public class BaseResult<T> {

    @Schema(description = "返回编码")
    public int code;
    @Schema(description = "返回信息")
    public String message;

    @Schema(description = "返回数据")
    public T data;

    private BaseResult() {
    }

    public BaseResult(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public BaseResult(ResultEnum resultEnum) {
        this.code = resultEnum.getCode();
        this.message = resultEnum.getMessage();
    }

    public BaseResult(int code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    public BaseResult(ResultEnum resultEnum, T data) {
        this.code = resultEnum.getCode();
        this.message = resultEnum.getMessage();
        this.data = data;
    }

    public static  BaseResult<?> success() {
        return new BaseResult<>(ResultEnum.SUCCESS);
    }

    /**
     * 默认形式,无返回数据成功
     * @return BaseResult
     */
    public static <T> BaseResult<T> success(Class<T> clazz) {
        return new BaseResult<>(ResultEnum.SUCCESS);
    }

    /**
     * 附带数据的成功
     * @param data 数据
     * @return BaseResult
     */
    public static <T> BaseResult<T> success(T data) {
        return new BaseResult<>(ResultEnum.SUCCESS,data);
    }

    public static  BaseResult<?> fail() {
        return new BaseResult<>(ResultEnum.FAILED);
    }

    /**
     * 默认形式,无返回数据失败
     * @return BaseResult
     */
    public static <T> BaseResult<T> fail(Class<T> clazz) {
        return new BaseResult<>(ResultEnum.FAILED);
    }

    /**
     * 携带信息,返回失败
     * @param message 失败信息
     * @return BaseResult
     */
    public static <T> BaseResult<T> fail(String message) {
        return new BaseResult<>(ResultEnum.FAILED.code,message);
    }

    public boolean judgeSuccess() {
        return ResultEnum.SUCCESS.code == this.code;
    }

}

PageResult

@Tag(name = "PageResult", description = "分页返回结果")
@Data
public class PageResult <T> {

    @Schema(description = "总记录数")
    public long total;

    @Schema(description = "数据列表")
    public T records;

    public PageResult() {
        this.total = 0L;
        this.records = null;
    }
    public PageResult(long total, T records) {
        this.total = total;
        this.records = records;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小雅痞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值