从零开始的SpringBoot项目 ( 七 ) 统一返回结果集Result 和 异常处理
import java.io.Serializable;
import lombok.Data;
import org.springframework.http.HttpStatus; @Data
public class Result implements Serializable { private static final long serialVersionUID = -1802122468331526708L; private Integer code;// 状态码
private String msg;// 返回信息
private Object data;// 返回数据 //自定义code,msg,data
private Result(Integer code, String msg, Object data) {
this.data = data;
this.code = code;
this.msg = msg;
} //自定义data
private Result(Object data) {
this.data = data;
this.code = HttpStatus.OK.value();
this.msg = HttpStatus.OK.getReasonPhrase();
} //自定义code,msg
private Result(Integer code, String msg) {
this.code = code;
this.msg = msg;
} private Result() {
this.code = HttpStatus.OK.value();
this.msg = HttpStatus.OK.getReasonPhrase();
} public static Result success(Integer code, String msg, Object data) {
return new Result(code, msg, data);
} public static Result success(Integer code, String msg) {
return new Result(code, msg);
} public static Result error(Integer code, String msg) {
return new Result(code, msg);
} public static Result success(Object data) {
return new Result(data);
} public static Result success() {
return new Result();
} }
Controller 层使用 Result
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.my_springboot.user.pojo.UserInfoDO;
import com.my_springboot.user.service.IUserInfoService;
import com.my_springboot.util.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController; /**
* <p>
* 用户信息前端控制器
* </p>
*
* @author JiHC
* @since 2020-08-21
*/
@RestController
@RequestMapping("/user")
@Api(value = "UserInfoController", tags = {"用户模块"})
public class UserInfoController { @Autowired
IUserInfoService userInfoService; @ApiOperation("新增用户信息")
@PostMapping(value = "/saveUser")
public Result saveUser(@RequestBody UserInfoDO userInfoDO) {
userInfoService.save(userInfoDO);
return Result.success(HttpStatus.CREATED.value(), HttpStatus.CREATED.getReasonPhrase());
} @ApiOperation("根据问题id修改问题")
@PutMapping(value = "/updateUser")
public Result updateUser(@RequestBody UserInfoDO userInfoDO) {
String id = userInfoDO.getId();
if (null == id || "".equals(id)) {// 无内容
return Result
.error(HttpStatus.NO_CONTENT.value(), HttpStatus.NO_CONTENT.getReasonPhrase());
}
if (null==userInfoService.getById(id)) {// 未找到
return Result
.error(HttpStatus.NOT_FOUND.value(), HttpStatus.NOT_FOUND.getReasonPhrase());
}
userInfoService.updateById(userInfoDO);
return Result.success();
} @ApiOperation("根据id删除用户信息")
@DeleteMapping(value = "/removeUser")
@ApiImplicitParam(name = "id", value = "用户id", dataType = "string", required = true, paramType = "query")
public Result removeUser(@RequestParam String id) {
if (null == id || "".equals(id)) {// 无内容
return Result
.error(HttpStatus.NO_CONTENT.value(), HttpStatus.NO_CONTENT.getReasonPhrase());
}
if (null==userInfoService.getById(id)) {// 未找到
return Result
.error(HttpStatus.NOT_FOUND.value(), HttpStatus.NOT_FOUND.getReasonPhrase());
}
userInfoService.removeById(id);
return Result.success();
} @ApiOperation("信息")
@PostMapping(value = "/listUserPage")
@ResponseBody
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNum", value = "当前页码", dataType = "int", required = true, paramType = "query", defaultValue = "1"),
@ApiImplicitParam(name = "pageSize", value = "每页数量", dataType = "int", required = true, paramType = "query", defaultValue = "10")
})
public Result listUserPage(Integer pageNum, Integer pageSize) {
Page<UserInfoDO> page = userInfoService.listUserPage(new Page(pageNum, pageSize));
return Result.success(page);
}
}
启动项目访问接口 访问修改接口 , 输入不存在的id , 期望返回404

成功!
统一异常处理 :
未添加异常处理时 , 参数错误的响应体 :

添加 控制器的异常处理类 ErrorHandler
import com.my_springboot.util.Result;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.NoHandlerFoundException; /**
* 控制器的异常处理类
*/
@ControllerAdvice
public class ErrorHandler { private static final org.slf4j.Logger log = LoggerFactory.getLogger(ErrorHandler.class); /**
* 输入参数校验异常
*/
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResponseEntity<Result> NotValidExceptionHandler(MethodArgumentNotValidException e) {
log.debug("异常详情 ", e);
BindingResult bindingResult = e.getBindingResult();
if (bindingResult.hasErrors() == false) {
return null;
}
Map<String, String> fieldErrors = new HashMap<>();
for (FieldError error : bindingResult.getFieldErrors()) {
fieldErrors.put(error.getField(), error.getCode() + "|" + error.getDefaultMessage());
}
return new ResponseEntity<>(Result.error(, "输入错误", fieldErrors),
HttpStatus.UNPROCESSABLE_ENTITY);
} /**
* 404异常处理
*/
@ExceptionHandler(value = NoHandlerFoundException.class)
public ResponseEntity<Result> NoHandlerFoundExceptionHandler(Exception e) {
log.debug("异常详情:", e);
return new ResponseEntity<>(Result.error(, "页面丢失了!"), HttpStatus.NOT_FOUND);
} /**
* 默认异常处理,前面未处理
*/
@ExceptionHandler(value = Throwable.class)
public ResponseEntity<Result> defaultHandler(Exception e) {
log.debug("异常详情:", e);
return new ResponseEntity<>(Result.error(, "服务器错误:" + e),
HttpStatus.INTERNAL_SERVER_ERROR);
}
}
重启项目 , 访问 Swagger , 参数错误的响应体 :

配置成功 !
从零开始的SpringBoot项目 ( 七 ) 统一返回结果集Result 和 异常处理的更多相关文章
- 从零开始的SpringBoot项目 ( 五 ) 整合 Swagger 实现在线API文档的功能
综合概述 spring-boot作为当前最为流行的Java web开发脚手架,越来越多的开发者选择用其来构建企业级的RESTFul API接口.这些接口不但会服务于传统的web端(b/s),也会服务于 ...
- 从零开始的SpringBoot项目 ( 四 ) 整合mybatis
一.创建一个SpringBoot项目 从零开始的SpringBoot项目 ( 二 ) 使用IDEA创建一个SpringBoot项目 二.引入相关依赖 <!--mysql数据库驱动--> & ...
- 从零开始的SpringBoot项目 ( 六 ) 整合 MybatisPlus 实现代码自动生成
1.添加依赖 <!-- MySQL数据库 --> <dependency> <groupId>mysql</groupId> <artifactI ...
- SpringBoot项目中处理返回json的null值
在后端数据接口项目开发中,经常遇到返回的数据中有null值,导致前端需要进行判断处理,否则容易出现undefined的情况,如何便捷的将null值转换为空字符串? 以SpringBoot项目为例,SS ...
- 从零开始搭建SpringBoot项目
一.新建springboot项目 1. new-->Project-->Spring Initralizr Group:com.zb Artifact:zbook springboot v ...
- 从零开始的SpringBoot项目搭建
前言 今天是我加入博客园的第一天今天刚好学习到SpringBoot,就顺便记录一下吧 一.创建项目 1.创建工程 ① 通过File > New > Project,新建工程,选择Sprin ...
- 从零开始的SpringBoot项目 ( 二 ) 使用IDEA创建一个SpringBoot项目
工欲善其事 , 必先利其器 . IntelliJ IDEA 2019.3.3 x64的安装与破解 下面详细说明下如何使用idea创建我们的第一个springboot项目: 首先打开idea主界面选择 ...
- 从零开始的SpringBoot项目 ( 一 ) Spring、SpringMVC和SpringBoot
要想开始一个SpringBoot项目 , 首先要知道SpringBoot是什么 , 可以做什么 , 再去研究怎么用 . 一.概念 1.Spring Spring是一个开源容器框架,可以接管web层,业 ...
- 从零开始的SpringBoot项目 ( 八 ) 实现基于Token的用户身份验证
1.首先了解一下Token uid: 用户唯一身份标识 time: 当前时间的时间戳 sign: 签名, 使用 hash/encrypt 压缩成定长的十六进制字符串,以防止第三方恶意拼接 固定参数(可 ...
随机推荐
- Label 组件基本写法
1.width,height 指定区域大小 文本 汉字 2 个字节 2.font 指定字体和字体大小 font(font_name,size) 3.image 显示在 Label 上的图像 支持 gi ...
- 7.9 NOI模拟赛 A.图 构造 dfs树 二分图
啥都想不出来的我是不是废了/dk 这道题考的主要是构造 而我想的主要是乱搞. 一个很假很假的做法:直接暴力4种颜色染色 我也不知道对不对.. 不过成功的话一定是对的. 然后考虑奇环的问题 一个很假很假 ...
- 一本通 1783 矩阵填数 状压dp 容斥 计数
LINK:矩阵填数 刚看到题目的时候感觉是无从下手的. 可以看到有n<=2的点 两个矩形. 如果只有一个矩形 矩形外的方案数容易计算考虑 矩形内的 必须要存在x这个最大值 且所有值<=x. ...
- python与pycharm的爱恨情仇
首先大家应该区别 这两者是什么? python 是一门语言 pycharm 是工具 还得交待的是 可以编译python的工具 不止这一款 比如说--eclipse idea ... eclipse中 ...
- iOS开发实战之搜索控制器UISearchController使用
当tableView中的数据过多的时候,在tableView上加一个搜索框就变的很必要了,本文就讨论搜索控制器的使用,以及谓词的简单实现. .m文件中代码如下 添加搜索控制器的各种协议 <UIS ...
- [COCOS2DX-LUA]0-006.cocos2dx中关于拖动屏幕物件,同时点击home键,返回后页面变黑的问题。
基本信息介绍: 引擎框架: Quick-Cocos2dx-Community-3.6 测试机型: 魅族MX5 问题简介: 有拖动效果的物件,在拖动的工程中,手指不放,同时点击home键退到后台. 再返 ...
- javascript数组笔记
1.数组 2.利用new创建数组 var arr= new Array(); 3.利用数组字面量创建数组 var 数组名=[]; 4.数组里面的数据叫 5.数组的索引(数组下标从0开始) 6.遍历数组 ...
- C#LeetCode刷题-树状数组
树状数组篇 # 题名 刷题 通过率 难度 218 天际线问题 32.7% 困难 307 区域和检索 - 数组可修改 42.3% 中等 315 计算右侧小于当前元素的个数 31.9% 困难 ...
- C#LeetCode刷题之#414-第三大的数(Third Maximum Number)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3710 访问. 给定一个非空数组,返回此数组中第三大的数.如果不存 ...
- 分享一个Flink checkpoint失败的问题和解决办法
本文来自: PerfMa技术社区 PerfMa(笨马网络)官网 接触Flink一段时间了,遇到了一些问题,其中有一个checkpoint失败导致作业重启的问题,遇到了很多次,重启之后一般也能恢复正常, ...