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

运行测试结果

springboot返回统一接口与统一异常处理的更多相关文章

  1. WebAPI接口设计:SwaggerUI文档 / 统一响应格式 / 统一异常处理 / 统一权限验证

    为什么还要写这类文章?因为我看过网上很多讲解的都不够全面,而本文结合实际工作讲解了swaggerui文档,统一响应格式,异常处理,权限验证等常用模块,并提供一套完善的案例源代码,在实际工作中可直接参考 ...

  2. 只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

    ## 统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生. 比较通用的返回值格式如下: ```jav ...

  3. Entity Framework 实体框架的形成之旅--基类接口的统一和异步操作的实现(3)

    在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...

  4. 《RESTful Web Services》第一章 使用统一接口

    序言 HTTP是一种应用层协议.SOAP和一些Ajax Web框架都将HTTP作为一种传输信息的协议,难以充分利用HTTP层的基础设施. 1.2 如何保持交互的可见性     可见性是HTTP的一个核 ...

  5. axios统一接口管理及优化

    之前我写了一篇文章,分享了自己的项目中对于接口管理的方法.总结下来就是:定义接口文件--withAxios导出--调用接口方法.这样实现了接口的统一管理和调用接口的语义化与简单化. 根据在项目的使用, ...

  6. Python-通过实例方法调用-统一接口的实现-getter methodcaller

    某项目中,我们的代码使用的2个不同库中的图形类: Circle,Triangle 这两个类中都有一个获取面积的方法接口,但是接口的名字不一样 统一这些接口,不关心具体的接口,只要我调用统一的接口,对应 ...

  7. contentprovider提供程序间共享数据的统一接口

    contentprovider提供程序间共享数据的统一接口

  8. 在nginx中使用lua直接訪问mysql和memcaced达到数据接口的统一

    安装nginx參见<nginx+lua+redis构建高并发应用> 让nginx 中的nginx_lua_module支持mysql 和memcache 下载 https://github ...

  9. SpringBoot写后端接口,看这一篇就够了!

    摘要:本文演示如何构建起一个优秀的后端接口体系,体系构建好了自然就有了规范,同时再构建新的后端接口也会十分轻松. 一个后端接口大致分为四个部分组成:接口地址(url).接口请求方式(get.post等 ...

随机推荐

  1. Vue-cli父子组件之间传参

    一.父传子( 先写父组件 父组件 <template> <子组件 :子组件的变量名='父组件的变量'> </子组件> //子组件的变量名前的冒号千万别丢了有和没有是 ...

  2. App上下左右滑动封装

    #coding=utf-8 from appium import webdriver from time import sleep caps = { "platformName": ...

  3. netty源码解解析(4.0)-25 ByteBuf内存池:PoolArena-PoolChunk

    PoolArena实现了用于高效分配和释放内存,并尽可能减少内存碎片的内存池,这个内存管理实现使用PageRun/PoolSubpage算法.分析代码之前,先熟悉一些重要的概念: page: 页,一个 ...

  4. PHP 插入排序 -- 折半查找

    1. 折半查找  -- Binary Insertion Sort 时间复杂度 : O(n^2) 适用条件 : 相对直接插入排序,减少了数值的比较次数.适用于需要排序的数码比较少的情况. <?p ...

  5. Cocos2d-x 学习笔记(11.7) Repeat RepeatForever

    1. 成员变量 Repeat: unsigned int _times; //create参数 unsigned int _total; //执行的次数 float _nextDt; //startW ...

  6. Windows突破远程连接最大数去掉限制登录

    当对方设置最大连接数 超过限制时 可以用这个命令 win+r  输入 mstsc /v:192.168.18.131:3389 /console   windows server 2003 sp2 以 ...

  7. xshell rz commend not found

    sudo apt-get install lrzsz 上传rz 下载sz

  8. ESP8266开发之旅 网络篇⑧ SmartConfig——一键配网

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  9. mac外接显示器 字体发虚解决方案

    描述 今天买的LG性价比之王21:9的2k显示器到了,但是连接mbp后发现,字体发虚,模糊 Macbook 外接显示器默认为 TV 模式,TV 渲染模式下,文字效果非常非常非常差 解决 下载 patc ...

  10. 为什么要用dubbo,dubbo是什么,为什么要和zk结合使用?

    目录 为什么要用dubbo dubbo是什么 dubbo架构 dubbo和zk关系 为什么要用dubbo? 随着互联网的发展,网站的应用规模不断扩大,常规的垂直架构已经无法应,分布式服务架构势在必行, ...