統一結果返回&統一異常處理


@

你們項目中是怎么統一返回前台數據的呢?自定義的異常信息又是怎么封裝的呢?因為所在公司封裝的好像不是那么好,還是覺得有必要自己該寫一套,權當是練手而已!

自定義異常枚舉

package com.demo.study.common.constant;

import lombok.Getter;
@Getter
public enum ResultCodeEnum {
    SUCCESS(true, 0000,"成功"),
    UNKNOWN_REASON(false, 0001, "未知錯誤"),
    BAD_SQL_GRAMMAR(false, 0002, "sql語法錯誤"),
    JSON_PARSE_ERROR(false, 0003, "json解析異常"),
    PARAM_ERROR(false, 0004, "參數不正確"),
    FILE_UPLOAD_ERROR(false, 0005, "文件上傳錯誤"),
    EXCEL_DATA_IMPORT_ERROR(false, 0006, "Excel數據導入錯誤");

    private Boolean success; // 是否響應成功
    private Integer code;    // 響應的狀態碼
    private String message;  // 響應的消息

    ResultCodeEnum(Boolean success, Integer code, String message) {
        this.success = success;
        this.code = code;
        this.message = message;
    }
}

自定義全局異常

package com.demo.study.common.handler;

import com.demo.study.common.constant.ResultCodeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
@ApiModel(value = "全局異常")
public class GlobalException extends RuntimeException{

    @ApiModelProperty(value = "狀態碼")
    private Integer code;

    /**
     * 接收自定傳遞的狀態碼和消息
     * @param code
     * @param message
     */
    public GlobalException(Integer code, String message){
        super(message);
        this.code = code;
    }

    /**
     * 接收枚舉類型參數
     */
    public GlobalException(ResultCodeEnum resultCodeEnum){
        super(resultCodeEnum.getMessage());
        this.code = resultCodeEnum.getCode();
    }


    @Override
    public String toString() {
        return "GlobalException{" +
                "message=" + this.getMessage() +
                "code=" + code +
                '}';
    }
}

自定義返回結果

package com.demo.study.common.entity;

import com.demo.study.common.constant.ResultCodeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;

@Data
@ApiModel(value = "全局的統一返回結果")
public class Result {

    @ApiModelProperty(value = "是否成功")
    private Boolean success;

    @ApiModelProperty(value = "返回狀態碼")
    private Integer code;

    @ApiModelProperty(value = "返回消息")
    private String message;

    @ApiModelProperty(value = "返回的數據!")
    private Map<String,Object> data = new HashMap<>();

    public Result() {
    }

    // ok 返回
    public static Result ok(){
        Result r = new Result();
        r.setSuccess(ResultCodeEnum.SUCCESS.getSuccess());
        r.setCode(ResultCodeEnum.SUCCESS.getCode());
        r.setMessage(ResultCodeEnum.SUCCESS.getMessage());
        return r;
    }

    // error 返回
    public static Result error(){
        Result r = new Result();
        r.setSuccess(ResultCodeEnum.UNKNOWN_REASON.getSuccess());
        r.setCode(ResultCodeEnum.UNKNOWN_REASON.getCode());
        r.setMessage(ResultCodeEnum.UNKNOWN_REASON.getMessage());
        return r;
    }

    // setResult 自定義返回
    public static Result definedResult(ResultCodeEnum resultCodeEnum){
        Result r = new Result();
        r.setSuccess(resultCodeEnum.getSuccess());
        r.setCode(resultCodeEnum.getCode());
        r.setMessage(resultCodeEnum.getMessage());
        return r;
    }

    // 這些是為了我們方便鏈式編程
    public Result success(Boolean success){
        this.setSuccess(success);
        return this;
    }
    public Result message(String message){
        this.setMessage(message);
        return this;
    }
    public Result code(Integer code){
        this.setCode(code);
        return this;
    }
    public Result data(String key,Object value){
        this.data.put(key,value);
        return this;
    }

    public Result data(Map<String,Object> map){
        this.setData(map);
        return this;
    }
}

全局異常處理

package com.demo.study.common.handler;


import com.demo.study.common.constant.ResultCodeEnum;
import com.demo.study.common.entity.Result;
import com.demo.study.common.util.ExceptionUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.BadSqlGrammarException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    // 處理的所有的 Exception
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Result error(Exception e){
        e.printStackTrace();
        return Result.error();
    }

    // 處理自己寫的統一異常 CodingException
    @ExceptionHandler(GlobalException.class)
    @ResponseBody
    public Result error(GlobalException e){
        log.error(ExceptionUtil.getStackMessage(e));
        return Result.error().code(e.getCode()).message(e.getMessage());
    }

    // 優先匹配精確的異常
    @ExceptionHandler(BadSqlGrammarException.class)
    @ResponseBody
    public Result error(BadSqlGrammarException e){
        e.printStackTrace();
        return Result.definedResult(ResultCodeEnum.BAD_SQL_GRAMMAR);
    }
}

異常工具類

package com.demo.study.common.util;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;

// 打印異常的堆棧信息
public class ExceptionUtil {

    /**
     * 打印異常堆棧信息
     * @param e
     * @return
     */
    public static String getStackMessage(Exception e){
        // 流
        StringWriter sw = null;
        PrintWriter pw = null;
        try {
            // 將出錯的信息輸出到 PrintWriter!
            sw = new StringWriter();
            pw = new PrintWriter(sw);
            e.printStackTrace(pw);
            pw.flush();
            sw.flush();
        } catch (Exception e1) {
            e1.printStackTrace();
        } finally {
            if (sw!=null){
                try {
                    sw.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
            if (pw!=null){
                pw.close();
            }
        }
        return sw.toString();
    }
}

簡單應用

package com.demo.study.service.impl;

import com.demo.study.common.constant.ResultCodeEnum;
import com.demo.study.common.entity.Result;
import com.demo.study.common.handler.GlobalException;
import com.demo.study.common.handler.GlobalExceptionHandler;
import com.demo.study.common.util.ExceptionUtil;
import com.demo.study.entity.User;
import com.demo.study.mapper.UserMapper;
import com.demo.study.service.USERervice;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * <p>
 *  服務實現類
 * </p>
 *
 * @author Echo
 * @since 2020-05-10
 */
@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements USERervice {

    @Override
    public Result testOkReturn() {
        Result r = null;
        try{
            // 邏輯獲取返回數據
            List<Map<String,Object>> returnList = new ArrayList<>();
            r = Result.ok().data("list",returnList);
        }catch(GlobalException e){
            return  new GlobalExceptionHandler().error(e);
        }
        return r;
    }

    @Override
    public Result definedErrorReturn() {
        Result r = null;
        try{
            // 邏輯獲取返回數據
            List<Map<String,Object>> returnList = new ArrayList<>();
            if(returnList.size() == 0){
                r = Result.definedResult(ResultCodeEnum.BAD_SQL_GRAMMAR);
            }
        }catch(GlobalException e){
            return  new GlobalExceptionHandler().error(e);
        }
        return r;
    }
}

好了,至此所有的異常處理和返回封裝都已處理完畢;你的項目是不是也可以改改呢?加油,奧利給!


免責聲明!

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



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