zoukankan      html  css  js  c++  java
  • 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);
        }
    }
    
    

    运行测试结果

  • 相关阅读:
    mojo 接口示例
    MojoliciousLite: 实时的web框架 概述
    接口返回json
    centos 6.7 perl 版本 This is perl 5, version 22 安装DBI DBD
    centos 6.7 perl 5.22 安装DBD 需要使用老的perl版本
    商业智能改变汽车行业
    商业智能改变汽车行业
    读MBA经历回顾(上)目的决定手段——北漂18年(48)
    perl 升级到5.20版本
    Group Commit of Binary Log
  • 原文地址:https://www.cnblogs.com/yloved/p/11553430.html
Copyright © 2011-2022 走看看