统一返回值以及自定义异常和异常处理

本文介绍了如何使用Spring框架配合Axios库实现RESTful API的统一错误处理,包括成功和失败状态的封装,自定义状态枚举及异常处理器的应用。

import com.fasterxml.jackson.annotation.JsonInclude;

@JsonInclude(JsonInclude.Include.NON_NULL)
public class AxiosResult<T>{

    private int status;
    private String message;
    private T data;


    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public AxiosResult(EnumStatus enumStatus, T data) {
        this.status = enumStatus.getStatus();
        this.message = enumStatus.getMessage();
        this.data = data;
    }

    private static  <T> AxiosResult<T> getAxiosResult(EnumStatus enumStatus, T data){
        return new AxiosResult<T>(enumStatus,data);
    }


    /**
     * 返回成功并携带数据
     */

    public static <T> AxiosResult<T> success(T data){
        return getAxiosResult(EnumStatus.OK,data);
    }


    /**
     * 返回失败并携带数据
     */

    public static <T> AxiosResult<T> error(T data){
        return getAxiosResult(EnumStatus.ERROR,data);
    }

    /**
     * 自定义其他状态
     */

    public static <T> AxiosResult<T> success(EnumStatus enumStatus,T data){
        return getAxiosResult(enumStatus,data);
    }

    public static <T> AxiosResult<T> error(EnumStatus enumStatus,T data){
        return getAxiosResult(enumStatus,data);
    }


}


public enum CustomEnum {
    OK(2000,"操作成功"),
    ERROR(4000,"操作失败"),
    USERNAME_ERROR(4004,"用户名错误"),
    PASSWORD_ERROR(4000,"密码错误"),
    NO_LOGIN(4002,"未登录"),
    ;

    private int Status;
    private String message;

    public int getStatus() {
        return Status;
    }

    public void setStatus(int status) {
        Status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    CustomEnum(int status, String message) {
        Status = status;
        this.message = message;
    }
}

import com.qy28.sm.http.CustomEnum;

public class MyException extends RuntimeException {

    private CustomEnum customEnum;

    public MyException(CustomEnum customEnum) {
        this.customEnum = customEnum;
    }

    public CustomEnum getCustomEnum() {
        return customEnum;
    }

    public void setCustomEnum(CustomEnum customEnum) {
        this.customEnum = customEnum;
    }
}
import com.qy28.sm.http.AjaxResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class MyExceptionHandler {

    @ExceptionHandler(MyException.class)
    public AjaxResult myHandler(MyException myexception){
        return AjaxResult.error(myexception.getCustomEnum());
    }
}

### 统一 JSON 返回格式 为了确保 API 或 Web 服务的一致性可预测性,采用统一的 JSON 响应结构至关重要。这种做法不仅简化客户端解析逻辑,还提高了用户体验。 一种常见的响应模式如下: ```json { "status": "success", "message": "", "data": {} } ``` 对于错误情况,则调整 `status` 字段并填充有意义的信息到 `message` 中: ```json { "status": "error", "message": "Resource not found.", "data": null } ``` 此设计允许开发者通过检查 `status` 来快速判断请求的结果状态,并依据具体场景处理业务数据或提示用户相应消息[^1]。 ### 实现全局异常捕获机制 在构建 RESTful API 时,推荐利用中间件来捕捉未预期的异常状况。以 Express.js 框架为例,可以创建自定义错误处理器函数,在发生任何内部服务器错误时自动触发该回调,从而返回标准化的错误信息给调用方。 ```javascript // 定义一个通用错误类扩展内置Error对象 class AppError extends Error { constructor(message, statusCode) { super(message); this.statusCode = statusCode; Object.setPrototypeOf(this, new.target.prototype); //修复原型链指向 } } app.use((err, req, res, next) => { const { message, statusCode = 500 } = err; res.status(statusCode).json({ status: 'fail', message, data: null }); }); ``` 上述代码片段展示了如何封装应用程序级别的错误实例以及设置默认 HTTP 状态码;当遇到问题时能够优雅地向外部暴露最小限度但又足够的诊断细节[^2]。 ### 使用第三方库辅助开发 除了手写这些功能外,也可以考虑引入成熟的开源项目如 express-validator 对输入参数做验证前移工作,或是借助于 celebrate 结合 Joi 库来进行更复杂的约束条件校验。这类工具可以帮助减少重复劳动的同时提升系统的健壮程度。 另外值得注意的是,无论采取何种方式实现统一响应与异常管理,都应当遵循 DRY (Don't Repeat Yourself)原则,尽可能把共通的部分抽象出来形成模块化组件以便维护重用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值