SpringBoot全局异常处理
程序员文章站
2022-04-19 13:38:47
一、场景介绍SpringBoot已经有一定的异常处理了,但是对于业务处理有些不合适的,因此我们需要对这些异常进行统一的捕获并处理。实体和日志用的是lombok插件,相关注解不清楚的可以百度一下,个人感觉挺好用的,推荐使用。二、自定义业务异常类自定义一个异常类,用于处理发生的业务异常(BusinessException.java)。package com.blog.exception;import lombok.AllArgsConstructor;import lombok.Builde...
一、场景介绍
SpringBoot已经有一定的异常处理了,但是对于业务处理有些不合适的,因此我们需要对这些异常进行统一的捕获并处理。
实体和日志用的是lombok插件,相关注解不清楚的可以百度一下,个人感觉挺好用的,推荐使用。
二、自定义业务异常类
自定义一个异常类,用于处理发生的业务异常(BusinessException.java)。
package com.blog.exception;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @path:com.blog.exception.BusinessException.java
* @className:BusinessException.java
* @description:业务异常处理
* @author:tanyp
* @dateTime:2020/7/11 11:52
* @editNote:
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class BusinessException extends RuntimeException {
private String msg;
}
三、全局异常处理
1、对捕获的异常进行简单的二次处理,返回异常的信息(GlobalException.java)
package com.blog.exception;
import com.blog.constant.Constants;
import com.blog.utils.Msg;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @path:com.blog.exception.GlobalException.java
* @className:GlobalException.java
* @description:全局异常处理
* @author:tanyp
* @dateTime:2020/7/11 11:50
* @editNote:
*/
@Slf4j
@ControllerAdvice
public class GlobalException {
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Msg handle(Exception e) {
if (e instanceof BusinessException) {
log.error("业务逻辑处理异常:{}", ((BusinessException) e).getMsg());
e.printStackTrace();
return Msg.error().add(((BusinessException) e).getMsg());
}
log.error("系统异常:{}", e);
return Msg.error().add(Constants.ERROR_EXCEPTION);
}
}
2、统一返回值封装类(Msg.java)
@Data
public class Msg {
private Integer code;
private String message;
private Object data = new Object();
public static Msg success() {
Msg result = new Msg();
result.setCode(200);
result.setMessage("success");
return result;
}
public static Msg error() {
Msg result = new Msg();
result.setCode(500);
result.setMessage("error");
return result;
}
public Msg add(Object value) {
this.data = value;
return this;
}
}
四、测试
1、根据用户名称查询用户信息,判断是否存在,不存在则抛异常返回:
@Slf4j
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User qryByUserName(String userName) {
User user = userMapper.qryByUserName(userName);
if (Objects.isNull(user)) {
throw new BusinessException("用户不存在");
}
return user;
}
}
2、controller直接放回查询结果,代码非常简单,没有什么业务性的,就不在这里赘述了。
3、用postman请求测试
测试结果:
打印日志信息:
2020-07-11 13:33:27,936 [http-nio-8008-exec-3] INFO com.alibaba.druid.pool.DruidDataSource.init 1003 - {dataSource-1} inited
2020-07-11 13:33:28,243 [http-nio-8008-exec-3] DEBUG com.blog.mapper.UserMapper.qryByUserName.debug 143 - ==> Preparing: select id,username,password,type,email,birthday,phone,sex,update_time,create_time from user where username = ?
2020-07-11 13:33:28,290 [http-nio-8008-exec-3] DEBUG com.blog.mapper.UserMapper.qryByUserName.debug 143 - ==> Parameters: zhangsan(String)
2020-07-11 13:33:28,410 [http-nio-8008-exec-3] DEBUG com.blog.mapper.UserMapper.qryByUserName.debug 143 - <== Total: 0
2020-07-11 13:33:28,416 [http-nio-8008-exec-3] ERROR com.blog.exception.GlobalException.handle 26 - 业务逻辑处理异常:用户不存在
BusinessException(msg=用户不存在)
at com.blog.service.impl.UserServiceImpl.qryByUserName(UserServiceImpl.java:37)
at com.blog.controller.LoginController.login(LoginController.java:52)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
本文地址:https://blog.csdn.net/typ1805/article/details/107283602
上一篇: 课时25.a标签基本使用(掌握)