首页 > 其他分享 >优雅处理封装返回

优雅处理封装返回

时间:2024-09-09 16:54:48浏览次数:3  
标签:返回 AjaxResult 封装 errorMsg 优雅 errorCode result return public

前言

大家写代码可能会使用try...catch处理异常,当然spring mvc 架构中各层会出现大量的try {...} catch {...} finally {...}代码块,不仅有大量的冗余代码,而且还影响代码的可读性。下面推荐大家这样处理,既方便代码也显得更加规范优雅,真的香的不行。

推荐理由:

  • 代码复制到项目中通过简单的配置即可实现
  • 可以灵活的根据自己的业务异常进行更细粒度的扩展以及异常的处理返回

处理步骤大致如下:

  • 封装统一返回结果类
  • 自定义异常封装类
  • 错误枚举类
  • 全局异常处理类
  • 测试

1:封装实体返回结果类

public class AjaxResult {
    //是否成功
    private Boolean success;
    //状态码
    private Integer code;
    //提示信息
    private String msg;
    //数据
    private Object data;
    //无参构造
    public AjaxResult() {

    }
    //自定义返回结果的构造方法
    public AjaxResult(Boolean success,Integer code, String msg,Object data) {
        this.success = success;
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    //自定义异常返回的结果
    public static AjaxResult defineError(BusinessException de){
     AjaxResult result = new AjaxResult();
        result.setSuccess(false);
        result.setCode(de.getErrorCode());
        result.setMsg(de.getErrorMsg());
        result.setData(null);
        return result;
    }
    //其他异常处理方法返回的结果
    public static AjaxResult otherError(ErrorEnum errorEnum){
     AjaxResult result = new AjaxResult();
        result.setMsg(errorEnum.getErrorMsg());
        result.setCode(errorEnum.getErrorCode());
        result.setSuccess(false);
        result.setData(null);
        return result;
    }
 public Boolean getSuccess() {
  return success;
 }
 public void setSuccess(Boolean success) {
  this.success = success;
 }
 public Integer getCode() {
  return code;
 }
 public void setCode(Integer code) {
  this.code = code;
 }
 public String getMsg() {
  return msg;
 }
 public void setMsg(String msg) {
  this.msg = msg;
 }
 public Object getData() {
  return data;
 }
 public void setData(Object data) {
  this.data = data;
 }   
}

2:自定义异常封装类

public class BusinessException extends RuntimeException {

 private static final long serialVersionUID = 1L;
 /**
  * 错误状态码
  */
 protected Integer errorCode;
 /**
  * 错误提示
  */
 protected String errorMsg;

 public BusinessException(){
     }

 public BusinessException(Integer errorCode, String errorMsg) {
         this.errorCode = errorCode;
         this.errorMsg = errorMsg;
     }

 public Integer getErrorCode() {
  return errorCode;
 }

 public void setErrorCode(Integer errorCode) {
  this.errorCode = errorCode;
 }

 public String getErrorMsg() {
  return errorMsg;
 }

 public void setErrorMsg(String errorMsg) {
  this.errorMsg = errorMsg;
 }
}

3:错误枚举类

public enum ErrorEnum {
    /**
     * 参数错误 1000-1999
     */
    MISSING_REQUIRED_PARAMETER(1000, "缺少必填参数"), PARAM_INVALID(1001, "参数非法"),


    /**
     * 数据错误 2000-2999
     */
    DATA_NONE(2000, "数据未找到"), DATA_WRONG(2001, "数据错误"), DATA_EXISTED(2002, "数据已存在"),
    INTERNAL_SERVER_ERROR(500, "服务器异常请联系管理员"),
 ;

 /** 错误码 */
 private Integer errorCode;

 /** 错误信息 */
 private String errorMsg;

 ErrorEnum(Integer errorCode, String errorMsg) {
  this.errorCode = errorCode;
  this.errorMsg = errorMsg;
 }

    public Integer getErrorCode() {
        return errorCode;
    }

    public String getErrorMsg() {
        return errorMsg;
    }
}

4:全局异常处理类

/**
 * 全局异常处理器
 * 
 */
@RestControllerAdvice
public class GlobalExceptionHandler
{
    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
    /**
     * 处理自定义异常
     *
     */
    @ExceptionHandler(value = BusinessException.class)
    public AjaxResult bizExceptionHandler(BusinessException e) {
     log.error(e.getMessage(), e);
        return AjaxResult.defineError(e);
    }
    /**
     *处理其他异常
     *
     */
    @ExceptionHandler(value = Exception.class)
    public AjaxResult exceptionHandler( Exception e) {
      log.error(e.getMessage(), e);
        return AjaxResult.otherError(ErrorEnum.INTERNAL_SERVER_ERROR);
      
    }
}

5:测试

@Api(tags = "查询管理")
@RestController
@RequestMapping("/machinery/experience")
public class ExperienceMachineryController extends BaseController {

    @ApiOperation(value = "查询管理")
    @PostMapping(value = "/query")
    public AjaxResult query() {
        throw new BusinessException(MISSING_REQUIRED_PARAMETER.getErrorCode(),MISSING_REQUIRED_PARAMETER.getErrorMsg());
    }

标签:返回,AjaxResult,封装,errorMsg,优雅,errorCode,result,return,public
From: https://blog.51cto.com/u_16406687/11961837

相关文章

  • Linux脚本中 指令返回值得获取,已经参数等获取
    在写脚本时,经常遇到这样的问题:如何获取当前进程号,脚本执行过的命令的进程号?如何获取当前时间?如何得到参数个数?如何得到脚本中各命令的返回信息?。。。。其实这些信息都能轻松从shell预定义的一些特殊变量获得,下面总结了一些常用的。 特殊的shell变量:#获取当前执行的sh......
  • 在 Qt5 中创建一个 HTTP 接口以返回屏幕截图
    在Qt5中创建一个HTTP接口以返回MainWindow的屏幕截图在Qt5中,可以通过使用QTcpServer和QTcpSocket来创建一个简单的HTTP服务器。通过这种方式,我们可以实现一个HTTP接口,当访问该接口时,会返回当前MainWindow窗口的屏幕截图。以下是实现这一功能的详细步骤与相关知......
  • 卡码网学习系列-8.抽象类、继承、封装、多态
    抽象概念一些概念一些概念abstractclassAnimal{//具体实现的方法publicvoideat(){System.out.println("Theanimaliseating.");}//抽象方法publicabstractvoidmakeSound();}classDogextendsAnimal{//......
  • Uni-app返回上一页面并携带参数【转】
    一、前言        需要实现这么一个需求:在一个列表页面,当子页面直接返回时,不刷新列表页面。但是当子页面的数据有变动时,需要刷新列表页面。本篇博客记录一下我是如何解决这个问题的。        解决思路:在onShow()方法内监听返回数据,当是需要当前页面刷新时,在子页......
  • 如何把网页的公式优雅地拷贝到word中:数学公式识别神器—Mathpix Snip
    这个编辑器其实在把chatgpt的公式粘贴到word中时就已经使用了,用的是网页版。现在下载了软件(但是好像一个月试用期过后得收费?但是就目前来说,体验感真的超级好)把公式复制粘贴转成mathtype公式可以截取电脑屏幕上的图像,如果图像上面有公式的话,就会识别,之后可以复制latex格式(第二个......
  • MySQL 函数查询返回NULL
    createtableuser(idbigintprimarykeyauto_increment,ageint);gorm使用函数查询时,通过IFNULL来确保查询不到记录时有默认值。max函数selectmax(age)fromuser;selectIFNULL(max(age),0)fromuser;sum函数count函数默认是0。......
  • 【电池专题】软包电池封装工序
    铝塑膜成型工序冲坑        铝塑膜成型工序,软包电芯可以根据客户的需求设计成不同的尺寸,当外形尺寸设计好后,就需要开具相应的模具,使铝塑膜成型。        成型工序也叫作冲坑,顾名思义,就是用成型模具在加热的情况下,在铝塑膜上冲出一个能够装卷芯的坑,具体的见......
  • nodejs 返回静态资源
    nodejs返回资源时,依照index.js文件的目录为基准。例如,index.js存放目录为/web/index.js 模板文件中的静态资源存放在./static/main.css那么静态资源的实际存放目录就是/web/static/main.css.这个文件夹要和index.js在同一个目录下才可以。 nodejs返回css无效当nodejs......
  • 封装、static~
    封装1.封装的基本知识1.1什么是封装  首先上面代码定义了一个Date类,类中有三个成员变量year、month、day和一个printDate成员方法,通过main函数实例化了一个date1对象,date1.分别访问了变量和方法,输出了2024年9月7日。  但如果将成员变量year的访问限定符public改......
  • HarmoryOS 网络请求模块及Axios库的封装
            我们在使用DevEecStudio进行网络请求时,需选择一个稳定、高效的网络库作为基础,如Axios、FetchAPI、Moya等;需要对网络请求的基本配置进行统一设定,比如基础URL、超时时间、默认请求头等;要进行错误处理:封装时应该考虑各种可能的错误情况,并提供统一的错误处理逻......