首页 > 其他分享 >定义通用返回包装类

定义通用返回包装类

时间:2024-12-31 14:30:11浏览次数:5  
标签:返回 SVN return 定义 包装 public commonError CommonResponse response

定义通用返回包装类

包装返回正确的数据格式,返回类型示例

{
  "code":200,
  "message":"success",
  "data":[
    
  ]
}

通用包装类

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author zhangshao
 * @description 通用响应类
 */
@NoArgsConstructor
@AllArgsConstructor
@Data
public class CommonResponse {
    /**
     * 状态码
     */
    private int code;
    /**
     * 对应请求的返回处理结果, 如:成功、失败等
     */
    private String message;

    private Object data;

    public static CommonResponse ok(){
        return CommonResponse.ok(null);
    }
    public static CommonResponse ok(Object result){
        return CommonResponse.ok("success",result);
    }

    public static CommonResponse ok(String status,Object result){
        CommonResponse response = new CommonResponse();
        response.setCode(200);
        response.setMessage(status);
        response.setData(result);
        return response;
    }

    public static CommonResponse error(String status){
        CommonResponse response = new CommonResponse();
        response.setCode(500);
        response.setMessage(status);
        return response;
    }
    public static CommonResponse error(CommonError commonError){
        CommonResponse response = new CommonResponse();
        response.setCode(commonError.getErrCode());
        response.setMessage(commonError.getErrMsg());
        return response;
    }

    public static CommonResponse error(int code,String status){
        CommonResponse response = new CommonResponse();
        response.setCode(code);
        response.setMessage(status);
        return response;
    }



}

其中CommonError为抽象类

public interface CommonError {
    public int getErrCode();
    public String getErrMsg();

    public CommonError setErrMsg(String errMsg);


}

image-20241231112627997

使用BusinessEnum实现该抽象类,使用BusinessErrorEnum定义业务异常

import lombok.AllArgsConstructor;

@AllArgsConstructor
public enum BusinessErrorEnum implements CommonError{
    // 通用错误类型10001
    PARAMETER_VALIDATION_ERROR(10001,"参数校验错误"),

    UNKNOWN_ERROR(10002,"未知错误"),

    // 20000开头为用户信息相关错误定义
    USER_NOT_EXIST(20001,"用户不存在"),

    // 30001开头为svn相关错误定义
    ADD_SVN_REPO_ERROR(30001,"添加SVN仓库失败"),
    DEL_SVN_REPO_ERROR(30002,"删除SVN仓库失败"),

    BATCH_DEL_SVN_REPO_ERROR(30003,"批量删除SVN仓库失败"),


    EDIT_SVN_REPO_ERROR(30004,"编辑SVN仓库失败"),

    DUPLICATE_SVN_REPO_ERROR(30005,"重复添加SVN仓库"),

    ;
    private int errCode;
    private String errMsg;

    @Override
    public int getErrCode() {
        return this.errCode;
    }

    @Override
    public String getErrMsg() {
        return this.errMsg;
    }

    @Override
    public CommonError setErrMsg(String errMsg) {
        this.errMsg = errMsg ;
        return this;
    }
}

使用BusinessException自定义异常类。

import com.hbisdt.util.CommonError;

/**
 *
 * @author zhangshao
 * @date 2024/12/30 09:20
 * @description 包装器业务异常类实现
 */

public class BusinessException extends RuntimeException implements CommonError {

    private CommonError commonError;

    /**
     * 直接接收BusinessErrorEnum的传参用于构造业务异常
     * @param commonError
     */
    public BusinessException(CommonError commonError) {
        super();
        this.commonError = commonError;
    }

    public BusinessException(CommonError commonError,String errMsg){
        super();
        this.commonError = commonError;
        this.commonError.setErrMsg(errMsg);

    }

    @Override
    public int getErrCode() {
        return this.commonError.getErrCode();
    }

    @Override
    public String getErrMsg() {
        return this.commonError.getErrMsg();
    }

    @Override
    public CommonError setErrMsg(String errMsg) {
        this.commonError.setErrMsg(errMsg);
        return this;
    }
}

同时,为了使throw出去的业务异常能最终处理,定义全局异常处理类GlobalExceptionHandler

import com.hbisdt.util.BusinessErrorEnum;
import com.hbisdt.util.CommonResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 处理统一异常的handler
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {


    @ExceptionHandler(BusinessException.class)
    public Object handleBusinessException(BusinessException e) {
        log.error("BusinessException: ", e);
        return CommonResponse.error(e.getErrCode(),e.getErrMsg());
    }

    @ExceptionHandler(Exception.class)
    public Object handleException(Exception e) {
        log.error("Default Exception: ", e);
        return CommonResponse.error(BusinessErrorEnum.UNKNOWN_ERROR);
    }

}

使用示例

 	@PostMapping("/svn/deleteRepo")
    public CommonResponse deleteRepo(@RequestBody SvnRepo svnRepo) throws BusinessException {
        log.info("删除SVN仓库,参数:{}", svnRepo.getId());
        boolean result = svnRepoService.deleteRepo(svnRepo.getId());
        log.info("删除结果:{}", result);
        if(!result){
            throw new BusinessException(BusinessErrorEnum.DEL_SVN_REPO_ERROR);
        }

        return CommonResponse.ok();
    }

业务正确,返回正确的包装类,业务抛出异常,返回错误信息和错误码。

{
    "code": 30005,
    "message": "重复添加SVN仓库",
    "data": null
}

此外,类似于10001这种参数校验错误,只需要在补充具体的参数错误原因,而无需重复定义。抛出异常时,可采用如下示例方式给出具体原因。

throw new BusinessException(BusinessErrorEnum.PARAMETER_VALIDATION_ERROR,"邮箱不允许为空,请确认后提交");

标签:返回,SVN,return,定义,包装,public,commonError,CommonResponse,response
From: https://www.cnblogs.com/shine-rainbow/p/18643954

相关文章

  • 《深入挖掘Python加解密:自定义加密算法的设计与实现》
    利用python实现加解密在正式编写各种加解密前,我们先写个小案例,如下。封面在文末呦!基础加解密-源码# 加密def encode():    source01 = '乐茵'    for c in source01:        ascii01 = ord(c)        ascii01 += 1      ......
  • c语言 - 如何安全返回局部变量的地址
    c语言返回局部变量的地址在C语言中,返回局部变量的地址是不安全的行为,因为一旦函数执行完毕,局部变量的内存将被释放,返回的地址将指向未定义的内存区域,这将导致不可预知的行为。以下是一个返回局部变量引用的例子,这是错误的做法:#include<stdio.h>int*getVarAddr()......
  • Log4net自定义配置说明及排错方法
    1、日志记录到数据库时,如对应日志表无日志,可通过如下方式排查:      A、检查数据库的连接事件日志,如无任何事件,则表明数据库连接失败,这时需要排查log4net.config的配置;如有事件,则将对应InsertSql直接在数据库内执行,排查对应SQL错误即可。      B、在AspnetCore中......
  • pytorch中神经网络的定义方法
    1.继承torch.nn.Module类(推荐方法)最常见和推荐的方式是通过继承torch.nn.Module类来创建一个自定义的神经网络模型。在这种方式下,你需要定义__init__()方法来初始化网络层,并在forward()方法中定义前向传播逻辑。示例:一个简单的全连接神经网络importtorchimpor......
  • pg_dump -Fc 导出的自定义格式数据库文件 相关操作
    目录实例实例将test.dmp文件转换为普通SQL内容,并打印到屏幕pg_restore-Upostgres-Fc-f-test.dump将test.dmp文件转换为普通SQL内容,并输出到test.sql文件中pg_restore-Upostgres-Fc-ftest.sqltest.dump备份得到自定义格式的数据库文件(dmp)......
  • uniapp使用uView2.x的自定义导航栏时,在app端出现同时两个导航栏的问题
    在使用自定义导航栏时,先是发现在h5端同时显示两个导航栏的问题.经查已成功解决,详见我的上一篇文章(在app.vue的onLoad内加上uni.hideTabBar();).但是运行到安卓真机后发现还是存在同样的情况,出现了原生底部导航栏与自定义导航栏同时出现的情况.再次经过查询得到答案,同样在a......
  • uView自定义底部导航栏发生错误:不显示图片和文本但是能正常跳转页面
    今天写前端发现原生导航栏只能在一个页面显示而不能在多个页面显示导航栏,所以只能用uView2.x的自定义导航栏来完成这个需求,遇到以下问题:底部导航栏图片和文本不显示但是点击却可以正常条状页面的问题:错误原因:在page.json内配置了"tabBar"属性这个不可或缺,没有这个不能正......
  • 微信小程序:定义页面标题,动态设置页面标题,json
    1、常规设置页面标题正常微信小程序中,设置页面标题再json页面中进行设置,例如{"usingComponents":{},"navigationBarTitleText":"标题","navigationBarBackgroundColor":"#78b7f7","navigationBarTextStyle":"white"}......
  • Vue3使用EasyOFD.js实现ofd文件自定义展示
    EasyOFD.js——一个在web端展示ofd文件的控件,该控件基于CANVAS绘制。官网提供的事例,不适合用于多页ofd文件的展示,本文基于EAYSOFD实现放大、缩小、页面跳转以及多页滚动等功能1、安装EAYSOFD依赖和EASYOFD组件//依赖npmijszipx2jsjb2opentype.js//本程序npmieasyofd......
  • Java难绷知识03——包装器类及其自动装箱和拆箱
    Java难绷知识03——包装器类及其自动装箱和拆箱本篇文章和之前的倾向稍微有些不同,这篇文章我不仅要讨论一些容易头疼的细节,而且我打算尝试讨论一下如何理解Java中的包装类以及自动拆箱和自动装箱自动装箱(Autoboxing)和自动拆箱(Unboxing)是在基本数据类型和它们对应的包装类之间“......