Spring Boot 统一返回结果及异常处理
在 Spring Boot 构建电商基础秒杀项目 (三) 通用的返回对象 & 异常处理 基础上优化、调整
一、通用类
1.1 通用的返回对象
public class CommonReturn {
private Integer code;
private String msg;
private Object data;
private CommonReturn(CommonResult commonResult) {
this.code = commonResult.getCode();
this.msg = commonResult.getMsg();
}
public static CommonReturn success(Object obj) {
CommonReturn commonReturn = new CommonReturn(ResultEnum.SUCCESS);
commonReturn.data = obj;
return commonReturn;
}
public static CommonReturn error(CommonResult commonResult) {
CommonReturn commonReturn = new CommonReturn(commonResult);
return commonReturn;
}
public static CommonReturn error(CommonResult commonResult, String msg) {
CommonReturn commonReturn = new CommonReturn(commonResult);
commonReturn.msg = msg;
return commonReturn;
}
public Integer getCode() {
return code;
}
public String getMsg() {
return msg;
}
public Object getData() {
return data;
}
}
1.2 返回接口
public interface CommonResult {
Integer getCode();
String getMsg();
void setMsg(String msg);
}
1.3 返回枚举
public enum ResultEnum implements CommonResult {
SUCCESS(0, "成功。"),
PARAM_ERROR(1001,"参数验证失败。"),
UNKNOWN_ERROR(9999,"未知错误。"),
;
private Integer code;
private String msg;
ResultEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
@Override
public Integer getCode() {
return code;
}
@Override
public String getMsg() {
return msg;
}
@Override
public void setMsg(String msg) {
this.msg = msg;
}
}
1.4 自定义异常
public class BusinessException extends Exception implements CommonResult {
private CommonResult commonResult;
public BusinessException(CommonResult commonResult) {
super();
this.commonResult = commonResult;
}
public BusinessException(CommonResult commonResult, String msg) {
super();
this.commonResult = commonResult;
this.setMsg(msg);
}
@Override
public Integer getCode() {
return this.commonResult.getCode();
}
@Override
public String getMsg() {
return this.commonResult.getMsg();
}
@Override
public void setMsg(String msg) {
this.commonResult.setMsg(msg);
}
}
二、统一异常处理
@RestControllerAdvice
public class BusinessExceptionHandler {
/**
* 参数校验异常
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public Object handleBindException(MethodArgumentNotValidException ex) {
StringBuilder errMsgBuilder = new StringBuilder();
ex.getBindingResult().getFieldErrors().forEach((fieldError) -> {
errMsgBuilder.append(fieldError.getDefaultMessage());
});
return CommonReturn.error(ResultEnum.PARAM_ERROR, errMsgBuilder.toString());
}
/**
* 自定义异常
*/
@ExceptionHandler(BusinessException.class)
public Object handleBusinessException(BusinessException ex){
return CommonReturn.error(ex);
}
@ExceptionHandler(Exception.class)
public Object handleException(Exception ex){
return CommonReturn.error(ResultEnum.UNKNOWN_ERROR, ex.getMessage());
}
}
三、统一返回结果
@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType,
ServerHttpRequest request, ServerHttpResponse response) {
// swagger 不处理
String uri = request.getURI().toString();
if(uri.contains("/v2/api-docs") || uri.contains("/swagger-resources") || uri.contains("/swagger-ui.html")) {
return body;
}
if(body == null) {
return CommonReturn.success(null);
} else if(body instanceof CommonReturn) {
return body;
}
return CommonReturn.success(body);
}
}
测试 Controller
@RestController
public class TestController {
@RequestMapping("/empty")
public void empty() {
}
@RequestMapping("/exception")
public void exception() throws BusinessException {
throw new BusinessException(ResultEnum.PARAM_ERROR);
}
@RequestMapping("/object")
public TestResult object() {
TestResult testResult = new TestResult();
testResult.setId(1L);
testResult.setName("name");
return testResult;
}
class TestResult {
@JsonSerialize(using= ToStringSerializer.class)
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
测试结果
// empty
{
"code": 0,
"msg": "成功。",
"data": null
}
// exception
{
"code": 1001,
"msg": "参数验证失败。",
"data": null
}
// object
{
"code": 0,
"msg": "成功。",
"data": {
"id": "1",
"name": "name"
}
}
同时可以使用 RequestBodyAdvice 统一处理入参,但是不支持 GET 方法
Spring Boot 统一返回结果及异常处理的更多相关文章
- Spring Boot 2 Webflux的全局异常处理
https://www.jianshu.com/p/6f631f3e00b9 本文首先将会回顾Spring 5之前的SpringMVC异常处理机制,然后主要讲解Spring Boot 2 Webflu ...
- spring boot 接口返回值封装
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- spring boot 统一异常处理
需求源自于任何一个业务的编写总会有各种各样的条件判断,需要时时手动抛出异常,又希望让接口返回友好的错误信息. spring boot提供的帮助是自动将异常重定向到路由为/error的控制器 但是我们又 ...
- Spring Boot统一异常处理实践
摘要: SpringBoot异常处理. 原文:Spring MVC/Boot 统一异常处理最佳实践 作者:赵俊 前言 在 Web 开发中, 我们经常会需要处理各种异常, 这是一件棘手的事情, 对于很多 ...
- spring boot 统一接口异常返回值
创建业务 Exception 一般在实际项目中,推荐创建自己的 Exception 类型,这样在后期会更容易处理,也比较方便统一,否则,可能每个人都抛出自己喜欢的异常类型,而造成代码混乱 Servic ...
- Spring Boot 系列教程6-全局异常处理
@ControllerAdvice源码 package org.springframework.web.bind.annotation; import java.lang.annotation.Ann ...
- spring boot 接口返回值去掉为null的字段
现在项目都是前后端分离的,返回的数据都是使用json,但有些接口的返回值存在 null或者"",这种字段不仅影响理解,还浪费带宽,需要统一做一下处理,不返回空字段,或者把NULL转 ...
- Spring Boot 统一异常这样处理和剖析,安否?
话说异常 「欲渡黄河冰塞川,将登太行雪满天」,无论生活还是计算机世界难免发生异常,上一篇文章RESTful API 返回统一JSON数据格式 说明了统一返回的处理,这是请求一切正常的情形:这篇文章将说 ...
- Spring boot之返回json数据
1.步骤: 1. 编写实体类Demo 2. 编写getDemo()方法 3. 测试 2.项目构建 编写实体类Demo package com.kfit; /** * 这是一个测试实体类. */ pub ...
随机推荐
- AQS解析
什么是AQS? AQS是JUC内存的基石,它本质上是一个抽象类,定义了多线程下资源争夺与释放的规则和过程,许多实现类都是继承于AQS,使用AQS的骨架. AQS的原理 AQS总体上来看是由一个FIFO ...
- 构建者模式(Builder pattern)
构建者模式应用场景: 主要用来构建一些复杂对象,这里的复杂对象比如说:在建造大楼时,需要先打牢地基,搭建框架,然后自下向上地一层一层盖起来.通常,在建造这种复杂结构的物体时,很难一气呵成.我们需要首先 ...
- 7 apache和nginx的区别
7 apache和nginx的区别 nginx 相对 apache 的优点: 轻量级,同样起web 服务,比apache 占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,支持更多的并 ...
- 简单了解JSON Web令牌(JWT)
什么是JWT JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该信息可以被验证和信任,因为它 ...
- Redis学习(一)——初识Redis
1.Redis是什么 1)REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统. 2)Redis的特点 Red ...
- 17flask分页
一,flask_sqlachemy的使用 如果想要展示出来的页面是分页显示,则首先需要知道每页应该分多少个条目,然后通过数据库去查找对应的条数,同时也需要和分页所需的"paginate&qu ...
- 洛谷日报 & 原来博客(转载)
震惊,新的功能:可以按Ctrl + F 进行关键字查询. \(update\) on 10.26:把这两个月的日报也加入进去了,并且修复了几个错误. 本文会把小编用过的博客和比较好的博客放在这里. 可 ...
- CSS浮动好文章
http://www.cnblogs.com/iyangyuan/archive/2013/03/27/2983813.html 看完上面这篇文章,我哭了.写的真好,我这块更菜.
- python实现二叉树递归遍历与非递归遍历
一.中序遍历 前中后序三种遍历方法对于左右结点的遍历顺序都是一样的(先左后右),唯一不同的就是根节点的出现位置.对于中序遍历来说,根结点的遍历位置在中间. 所以中序遍历的顺序:左中右 1.1 递归实现 ...
- python 与 百度人脸识别api
用python来做人脸识别代码量少 思路清晰, 在使用之前我们需要在我们的配置的编译器中通过pip install baidu-aip 即可 from aip import AipFac ...