springboot返回统一接口与统一异常处理
springboot返回统一接口与统一异常处理
编写人员:yls
编写时间:2019-9-19
- 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返回统一接口与统一异常处理的更多相关文章
- WebAPI接口设计:SwaggerUI文档 / 统一响应格式 / 统一异常处理 / 统一权限验证
为什么还要写这类文章?因为我看过网上很多讲解的都不够全面,而本文结合实际工作讲解了swaggerui文档,统一响应格式,异常处理,权限验证等常用模块,并提供一套完善的案例源代码,在实际工作中可直接参考 ...
- 只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常
## 统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生. 比较通用的返回值格式如下: ```jav ...
- Entity Framework 实体框架的形成之旅--基类接口的统一和异步操作的实现(3)
在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...
- 《RESTful Web Services》第一章 使用统一接口
序言 HTTP是一种应用层协议.SOAP和一些Ajax Web框架都将HTTP作为一种传输信息的协议,难以充分利用HTTP层的基础设施. 1.2 如何保持交互的可见性 可见性是HTTP的一个核 ...
- axios统一接口管理及优化
之前我写了一篇文章,分享了自己的项目中对于接口管理的方法.总结下来就是:定义接口文件--withAxios导出--调用接口方法.这样实现了接口的统一管理和调用接口的语义化与简单化. 根据在项目的使用, ...
- Python-通过实例方法调用-统一接口的实现-getter methodcaller
某项目中,我们的代码使用的2个不同库中的图形类: Circle,Triangle 这两个类中都有一个获取面积的方法接口,但是接口的名字不一样 统一这些接口,不关心具体的接口,只要我调用统一的接口,对应 ...
- contentprovider提供程序间共享数据的统一接口
contentprovider提供程序间共享数据的统一接口
- 在nginx中使用lua直接訪问mysql和memcaced达到数据接口的统一
安装nginx參见<nginx+lua+redis构建高并发应用> 让nginx 中的nginx_lua_module支持mysql 和memcache 下载 https://github ...
- SpringBoot写后端接口,看这一篇就够了!
摘要:本文演示如何构建起一个优秀的后端接口体系,体系构建好了自然就有了规范,同时再构建新的后端接口也会十分轻松. 一个后端接口大致分为四个部分组成:接口地址(url).接口请求方式(get.post等 ...
随机推荐
- Liang-Barsky算法
Liang-Barsky算法 在Cohen-Sutherland算法提出后,梁友栋和Barsky又针对标准矩形窗口提出了更快的Liang-Barsky直线段裁剪算法. 梁算法的主要思想: (1)用参数 ...
- POJ1017&&UVA311 Packets(中文题面版)
感谢有道翻译--- Description A工厂生产的产品是用相同高度h的方形包装,尺寸为1* 1,2 * 2,3 * 3,4 * 4,5 * 5,6 6.这些产品总是以与产品高度h相同,尺寸为66 ...
- Rancher 2.1平台搭建及使用
一.概述 1.1.什么是Rancher Rancher是一套容器管理平台,它可以帮助组织在生产环境中轻松快捷的部署和管理容器. Rancher可以轻松地管理各种环境的Kubernetes,满足IT需求 ...
- CVE-2016-7124漏洞复现
CVE-2016-7124漏洞复现 __wakeup()魔术方法绕过 实验环境 操作机:Windows 10 服务器:apache 2.4 数据库:mysql 5.0 PHP版本:5.5 漏洞影响版本 ...
- enable_shared_from_this
头文件<memory> enable_shared_from_this是一个模板类. 使用场景:需要把自己类对象作为参数传给其他函数时,就需要传递一个指向自身的share_ptr. str ...
- 10.Nginx流行架构LNMP
1.什么是LNMP架构 LNMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写.L指Linux,N指Nginx,M一般指MySQL,也可以指MariaDB,P一般指PHP,也可以 ...
- Spring Boot 开发微信公众号后台
Hello 各位小伙伴,松哥今天要和大家聊一个有意思的话题,就是使用 Spring Boot 开发微信公众号后台. 很多小伙伴可能注意到松哥的个人网站(http://www.javaboy.org)前 ...
- Java多线程编程(三)线程间通信
线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...
- 数据结构(十六)模式匹配算法--Brute Force算法和KMP算法
一.模式匹配 串的查找定位操作(也称为串的模式匹配操作)指的是在当前串(主串)中寻找子串(模式串)的过程.若在主串中找到了一个和模式串相同的子串,则查找成功:若在主串中找不到与模式串相同的子串,则查找 ...
- int和string的相互装换 (c++)
int和string的相互装换 (c++) int转换为string 第一种方法 to_string函数,这是c++11新增的函数 string to_string (int val); string ...