SpringBoot(七)_统一异常处理
我感觉看了这节课,给我的思考还是很多的,感觉受益良多。废话不多说,一起学习。
统一的 外层结构返回
这样利于代码看着也规范,前端处理也统一
# 错误返回
{
"code": 1,
"msg": "未成年禁止入内",
"data": null
}
# 正确返回
{
"code": 0,
"msg": "成功",
"data":{
"id": 8,
"name": "maomao",
"age": 19
}
}
(1) 实现这个我们要定义一个返回结果的实体类
package com.imooc.entity;
/**
* http请求做外层对象
* @Auther: curry
* @Date: 2018/6/2 14:35
* @Description:
*/
public class Result<T> {
/**
* 状态码
*/
private Integer code;
/**
* 提示信息
*/
private String msg;
/**
* 返回数据
*/
private T data;
//get和set省略
}
(2)定义返回结果的工具类
package com.imooc.utils;
import com.imooc.entity.Result;
/**
* @Auther: curry
* @Date: 2018/6/2 14:39
* @Description:
*/
public class ResultUtil {
public static Result success(Object object){
Result result = new Result();
result.setCode(0);
result.setMsg("成功");
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;
}
}
(3) 使用规定的返回结果
注意:controller 只是用于请求和参数的传递,业务处理应该在service进行处理。这只是方便演示
@PostMapping("/girls")
public Result<Girl> girlAdd(@Valid Girl girl, BindingResult bindingResult){
if(bindingResult.hasErrors()){
return ResultUtil.error(1,bindingResult.getFieldError().getDefaultMessage());
}
return ResultUtil.success(girlRepository.save(girl));
}
(4) 这样就使我们返回结果如上面所示的一样了
定义统一的异常处理
实现业务:获取女生的年龄,
如果小于10岁:返回:还在小学
如果大于10岁小于16岁:返回:还在初中
controller层
@GetMapping(value = "/girls/getAge/{id}")
public void getAge(@PathVariable("id") Integer id) throws Exception {
girlService.getAge(id);
}
service层
@Service
public class GirlService {
@Resource
private GirlRepository girlRepository;
public void getAge(Integer id) throws Exception {
Girl girl = girlRepository.getOne(id);
Integer age = girl.getAge();
if(age<10){
throw new Exception("还在小学");
}else if(age >10 && age< 16){
throw new Exception("还在初中");
}
}
}
监听异常
package com.imooc.handle;
import com.imooc.aspect.HttpAspect;
import com.imooc.entity.Result;
import com.imooc.exception.GirlException;
import com.imooc.utils.ResultUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @Auther: curry
* @Date: 2018/6/2 15:05
* @Description:
*/
@ControllerAdvice
public class ExceptionHandle {
private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result handle(Exception e){
return ResultUtil.error(100,e.getMessage());
}
}
测试返回结果,控制台不会报错
{
"code": 100,
"msg": "还在初中",
"data": null
}
实现自己的Exception
创建自己的Exception
继承自RuntimeException 是因为 spring 这个框架对运行时异常会进行数据回滚,如果是Exception .则不会
package com.imooc.exception;
import com.imooc.enums.ResultEnum;
/**
* @Auther: curry
* @Date: 2018/6/2 15:30
* @Description:
*/
public class GirlException extends RuntimeException{
private Integer code;
// 这里使用了枚举
public GirlException(ResultEnum resultEnum) {
super(resultEnum.getMsg());
this.code = resultEnum.getCode();
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
创建枚举类
package com.imooc.enums;
/**
* @Auther: curry
* @Date: 2018/6/2 15:46
* @Description:
*/
public enum ResultEnum {
UNKNOW_ERROR(-1,"未知错误"),
SUCCESS(0,"成功"),
PRIMARY_SCHOOL(100,"还在小学"),
MIDDLE_SCHOOL(101,"还在初中"),
;
private Integer code;
private String msg;
ResultEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public Integer getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
修改异常捕获类
public Result handle(Exception e){
// return ResultUtil.error(100,e.getMessage());
if (e instanceof GirlException){
GirlException girlException = (GirlException)e;
return ResultUtil.error(girlException.getCode(),girlException.getMessage());
}else {
logger.info("【系统异常】{}",e);
return ResultUtil.error(-1,"未知错误");
}
}
修改service类
public void getAge(Integer id) throws Exception {
Girl girl = girlRepository.getOne(id);
Integer age = girl.getAge();
if(age<10){
throw new GirlException(ResultEnum.PRIMARY_SCHOOL);
}else if(age >10 && age< 16){
throw new GirlException(ResultEnum.MIDDLE_SCHOOL);
}
}
测试
{
"code": 101,
"msg": "还在初中",
"data": null
}
代码下载:github
玩的开心!
SpringBoot(七)_统一异常处理的更多相关文章
- SpringBoot系列——自定义统一异常处理
前言 springboot内置的/error错误页面并不一定适用我们的项目,这时候就需要进行自定义统一异常处理,本文记录springboot进行自定义统一异常处理. 1.使用@ControllerAd ...
- springboot aop + logback + 统一异常处理 打印日志
1.src/resources路径下新建logback.xml 控制台彩色日志打印 info日志和异常日志分不同文件存储 每天自动生成日志 结合myibatis方便日志打印(debug模式) < ...
- SpringBoot统一异常处理后TX-LCN分布式事务无法捕获异常进行回滚
通常我们使用SpringBoot都会进行统一异常处理,例如写一个BaseController,在BaseController里进行统一异常处理,然后其他的Controller都继承BaseContro ...
- SpringBoot系列(十)优雅的处理统一异常处理与统一结果返回
SpringBoot系列(十)统一异常处理与统一结果返回 往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列 ...
- SpringBoot第七集:异常处理与整合JSR303校验(2020最新最易懂)
SpringBoot第七集:异常处理与整合JSR303校验(2020最新最易懂) 一.SpringBoot全局异常 先讲下什么是全局异常处理器? 全局异常处理器就是把整个系统的异常统一自动处理,程序员 ...
- SpringBoot 统一异常处理
统一异常处理: @ControllerAdvice public class GlobalExceptionHandler { private Logger logger = LoggerFactor ...
- 【异常处理】Springboot对Controller层方法进行统一异常处理
Controller层方法,进行统一异常处理 提供两种不同的方案,如下: 方案1:使用 @@ControllerAdvice (或@RestControllerAdvice), @ExceptionH ...
- spring 或 springboot统一异常处理
spring 或 springboot统一异常处理https://blog.csdn.net/xzmeasy/article/details/76150370 一,本文介绍spring MVC的自定义 ...
- 配置springboot在访问404时自定义返回结果以及统一异常处理
在搭建项目框架的时候用的是springboot,想统一处理异常,但是发现404的错误总是捕捉不到,总是返回的是springBoot自带的错误结果信息. 如下是springBoot自带的错误结果信息: ...
随机推荐
- avascript小技巧
avascript小技巧 事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture() ...
- 三剑客之sed&grep
第1章 练习题 1.1 第1题 取得/etc/hosts 文件的权限 如何取得/etc/hosts 文件的权限对应的数字内容,如-rw-r--r-- 为 644,要求使用命令取得644 这样的数字. ...
- React——JSX
一.将表达式嵌套在JSX中 要在JSX中内嵌js表达式只需要将js表达式放在{}中,例如: const element = <h1>this is a JSX {sayName()}< ...
- Pyhton配置CGI
目录 CGI配置(Mac版) 添加CGI python文件测试 CGI--common gateway interface 通用网关接口的意思,本文通过python的CGI来整体了解下CGI的配置和使 ...
- 查找linux镜像源中的软件版本并进行安装
输入以下代码进行软件查找 sudo apt-cache search YourSoftwareName 根据所得到的结果进行安装 sudo apt-get install YourSoftwareNa ...
- [PLC]ST语言六:DI/EI/FEND/WDT/FOR/NEXT
一:DI/EI/FEND/WDT/FOR/NEXT 说明:简单的顺控指令不做其他说明. 控制要求:无 编程梯形图: 结构化编程ST语言:
- hdu1285确定比赛名次(拓扑排序+优先队列)
传送门 第一道拓扑排序题 每次删除入度为0的点,并输出 这题要求队名小的排前面,所以要用到重载的优先队列 #include<bits/stdc++.h> using namespace s ...
- c#多线程中Lock()关键字的用法小结
本篇文章主要是对c#多线程中Lock()关键字的用法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 本文介绍C# lock关键字,C#提供了一个关键字lock,它可以把一段 ...
- SVN For Mac: Cornerstone.app破解版免费下载
Cornerstone.app下载地址 链接:https://pan.baidu.com/s/1kwQ65SBgfWXQur8Zdzkyyw 密码:rqe7 Cornerstone303 MAS.a ...
- 页码插入JS脚本
(function() { var obj = document.createElement("script"); obj.type = "text/javascript ...