springboot返回統一接口與統一異常處理


springboot返回統一接口與統一異常處理

編寫人員:yls
編寫時間:2019-9-19

  1. 0001-springboot返回統一接口與統一異常處理
    1. 簡介
    1. [創建統一的返回格式 Result](#創建統一的返回格式 Result "創建統一的返回格式 Result")
    1. 封裝統一返回格式工具類ResultUtil
    1. 測試用的實體類User
    1. 使用枚舉統一管理返回碼和返回信息
    1. 自定義異常類
    1. 統一異常處理
    1. 創建UserController
    1. 測試結果

簡介

在做后端服務開發時,想要每次獲取的數據和拋出的異常保持統一的返回結果,結構清晰,方便管理

創建統一的返回格式 Result

package com.example.itokenserviceadmin.config.baseResult;

import lombok.Data;

/**
 * http請求最外層對象,統一返回接口
 * @param <T>
 */

@Data
public class Result<T> {
    //返回碼
    private Integer code;
    //提示信息
    private String msg;
    //返回具體內容
    private T data;

}

封裝統一返回格式工具類ResultUtil

package com.example.itokenserviceadmin.utils;

import com.example.itokenserviceadmin.config.baseResult.Result;
import com.example.itokenserviceadmin.config.exceptionHandle.ResultEnum;
import com.example.itokenserviceadmin.config.exceptionHandle.UserException;

/**
 * 統一返回接口的工具類
 */
public class ResultUtil {
    public static Result success(Object object) {
        Result result = new Result();
        result.setCode(ResultEnum.SUCCESS.getCode());
        result.setMsg(ResultEnum.SUCCESS.getMsg());
        result.setData(object);
        return result;
    }

    public static Result success() {
        return success(null);
    }

    public static Result error(Integer code, String msg) {
        Result result = new Result();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }
    public static Result error(ResultEnum resultEnum) {
        return error(resultEnum.getCode(),resultEnum.getMsg());
    }
    public static Result error(UserException userException) {
        return error(userException.getCode(),userException.getMessage());
    }
}

測試用的實體類User

package com.example.itokenwebadmin.entity;


import lombok.Data;

import java.io.Serializable;

@Data
public class User implements Serializable {
    private String id;
    private String name;
    private String password;
}

使用枚舉統一管理返回碼和返回信息

package com.example.itokenserviceadmin.config.exceptionHandle;

import lombok.AllArgsConstructor;
import lombok.Getter;


/**
 * 在自定義異常的錯誤碼和信息時,如果過多,沒有統一管理,則會出現重復。
 * 使用枚舉統一管理code和message:
 */
@Getter
@AllArgsConstructor
public enum ResultEnum {
    UNKNOW_ERROR(-1, "未知錯誤"),
    SUCCESS(0, "成功");
    private Integer code;
    private String msg;
}

自定義異常類

package com.example.itokenserviceadmin.config.exceptionHandle;

import lombok.Data;

@Data
public class UserException extends RuntimeException {


    /**
     * 我們希望定位的錯誤更准確,
     * 希望不同的錯誤可以返回不同的錯誤碼,所以可以自定義一個Exception
     *
     *
     * 注意要繼承自RuntimeException,底層RuntimeException繼承了Exception,
     * spring框架只對拋出的異常是RuntimeException才會進行事務回滾,
     * 如果是拋出的是Exception,是不會進行事物回滾的
     */
    public UserException(ResultEnum resultEnum) {
        super(resultEnum.getMsg());
        this.code = resultEnum.getCode();
    }

    private Integer code;

}

統一異常處理

package com.example.itokenserviceadmin.config.exceptionHandle;

import com.example.itokenserviceadmin.config.baseResult.Result;
import com.example.itokenserviceadmin.utils.ResultUtil;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 統一異常處理
 */
@ControllerAdvice
public class ExceptionHandle {
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Result handle(Exception e) {
        if (e instanceof UserException) {
            UserException userException = (UserException) e;
            return ResultUtil.error(userException);
        } else {
            return ResultUtil.error(-1, e.getMessage());
        }
    }
}

創建UserController

package com.example.itokenserviceadmin.controller;

import com.example.itokenserviceadmin.config.baseResult.Result;
import com.example.itokenserviceadmin.config.exceptionHandle.ResultEnum;
import com.example.itokenserviceadmin.config.exceptionHandle.UserException;
import com.example.itokenserviceadmin.entity.User;
import com.example.itokenserviceadmin.service.UserService;
import com.example.itokenserviceadmin.serviceImpl.UserImpl;
import com.example.itokenserviceadmin.utils.ResultUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/success")
    public Result<User> success(User user){
        user.setId("3");
        return ResultUtil.success(user);
    }

    @RequestMapping("/err")
    public Result err(){
        return ResultUtil.error(ResultEnum.UNKNOW_ERROR);
    }

    @RequestMapping("/exception")
    public void exception() throws Exception {
        throw new UserException(ResultEnum.UNKNOW_ERROR);
    }
}

運行測試結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM