Rest风格的统一响应数据格式与全局异常处理

本文介绍了如何在Java Web开发中实现Rest风格的统一响应数据格式,包括成功和失败的模板,并通过定义枚举来封装错误信息。同时,文章讨论了如何创建一个全局异常处理机制,当Service层遇到异常时抛出自定义异常,并在Controller层不做捕获,最后由Spring MVC的过滤器进行全局异常拦截和处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.规定后台接口响应给前端页面的统一数据格式为:

成功:

{
  "code": "200",
  "msg": "success",
  "data":  {
      "userId": "1",
      "username": "sven",
      "password": "123"
    }
}

失败:

{
  "code": "500",
  "msg": "服务器异常!",
  "data": null
}

即controller层方法的返回值统一抽象为一个Result类,以规范响应到前端的数据格式。

2.定义一个枚举,封装错误时的响应内容(状态码与消息)

public enmu CodeMsg{

    USER_NOT_EXIST(40001,"用户名不存在"),
    PASS_IS_WRONG(40002,"密码与用户名不匹配");

    private int code;
    private String msg;

    ExceptionMessage(int code, String msg) {
        this.num = code;
        this.desc = msg;
    }

    public String getMsg(){
        return this.msg;
    }

    public Integer getCode(){
        return this.code;
    }

}

3.增加一个Result类,使用泛型与否皆可

class Result<T>{
    
    Integer code; //响应状态码

    String msg; //响应消息

    T data; //响应实体

    // ... 省略getter方法

   
    public <T> static Result success(T t){
    
        Result result = new Result<T>();
        result.setCode(200);
        result.setMsg("success");
        result.setData(t);
        return result;
    }

    public static Result success(){

        return success(null);
    }

    public static Result error(CodeMsg codeMsg){
        Result result = new Result<T>();
        result.setCode(codeMsg.getCode);
        result.setMsg(codeMsg.getMsg());
        result.setData(null);
        return null;
    }
}

4.思路:自定一个全局异常,在service层中遇到会返回失败的情况就抛出(抛出的自定义异常对象需要把CodeMsg对象封装进去,这样才能把错误内容响应到前端),交由controller层去处理,controller层中不进行try catch,最终由springmvc的全局异常处理机制(filter)进行拦截处理,所以还需要自定义拦截类的处理逻辑。

全局异常统一处理思路

// 自定义全局异常
public class ClobalException extends RuntimeException{
    
   CodeMsg codeMsg;

    ClobalException(CodeMsg codeMsg){
        this.codeMsg = codeMsg;
    }

    public CodeMsg getCodeMsg(){
        return codeMsg;
    }

}
// 自定义全局异常处理器
@ControllerAdvice  //自定义全局异常处理类
@Component
public class GlobalExceptionHandler{

    @ExceptionHandler //声明指定异常处理方法
    @ResponseBody
    public Result handler(GlobalRuntimeException exception){

        return Result.error(exception.getCodeMsg());

    }
    
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值