欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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请求测试

测试结果:
SpringBoot全局异常处理
打印日志信息:

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