• 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);
        }
    }
    
    

    运行测试结果

  • 相关阅读:
    挑战练习题2.3动态规划 poj1631 Bridging signals 最长递增子序列
    挑战练习题2.3动态规划 poj1065 Wooden Sticks 最长递减子序列
    挑战练习题2.3动态规划 poj3181 Dollar Dayz 完全背包
    挑战练习题2.3动态规划 poj3046 Ant Counting dp
    挑战练习题2.3动态规划 poj1742 Coins 多重背包
    挑战练习题2.3动态规划 poj3280Cheapest Palindrome 区间dp
    Matplotlib
    Bar-Code-Recognition-System Private
    图像处理项目——基于机器视觉技术的条形码在线识别系统设计
    github的使用
  • 原文地址:https://www.cnblogs.com/yloved/p/11553430.html
Copyright © 2020-2023  润新知