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等 ...
随机推荐
- 数据挖掘:关联规则的apriori算法在weka的源码分析
相对于机器学习,关联规则的apriori算法更偏向于数据挖掘. 1) 测试文档中调用weka的关联规则apriori算法,如下 try { File file = new File("F:\ ...
- [Luogu3797] 妖梦斩木棒
题目背景 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的n段.现在这个木棒可以看做由三种小段构成,中间的 ...
- JAVA实现扫描线算法
首先说一下,教科书上的扫描线算法确实是用c++很好实现,而且网上有很多源码,而java实现的基本没有(可能是我没看到),所以肖先生还是打算自己码(实验作业写这个而自己又个是写java的猿0.0). 对 ...
- 手写一个简单的ElasticSearch SQL转换器(一)
一.前言 之前有个需求,是使ElasticSearch支持使用SQL进行简单查询,较新版本的ES已经支持该特性(不过貌似还是实验性质的?) ,而且git上也有elasticsearch-sql 插件, ...
- The command ("dfs.browser.action.delete") is undefined 解决Hadoop Eclipse插件报错
Hadoop Eclipse插件 报错. 使用 hadoop-eclipse-kepler-plugin-2.2.0.jar 如下所示 Error Log 强迫症看了 受不了 The command ...
- call方法和apply方法
1.call 语法 call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 参数 thisObj 可选项.将被用作当前对象的对象. arg1,arg2, , argN ...
- 设计模式(十六)Mediator模式
在实际的工作小组的交流过程是,组员向仲裁者报告,仲裁者向组员下达指示,组员之间不再互相询问和指示.Mediator模式是指,当发生麻烦事情的时候,通知仲裁者:当发生涉及全体组员的事情时,也通知仲裁者. ...
- js循环和调用
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- VS Code断点调试PHP超详细萌新教程
AppServ安装 1. 下载 2. 安装,一路默认设置顺便设置sql密码即可.这里建议不要修改端口,后续教程默认80端口. 3.点我测试,有下图则恭喜你AppServ安装完成. Xdebug配置 1 ...
- 透明度设置opacity
透明度设置opacity属性 示例 <!DOCTYPE html> <html> <head> <style> div { background-col ...