SpringBoot搭建全局异常拦截

一、概述

在使用Spring Boot开发Web应用的过程中,我们经常会遇到程序抛出异常的情况。如何优雅地处理这些异常,返回友好的错误信息给客户端,是很重要的一件事情。Spring Boot提供了全局异常处理机制,可以方便地实现统一的异常处理逻辑,减少代码重复,提高开发效率。

本文将介绍如何使用Spring Boot自带的全局异常处理机制,搭建一个通用的全局异常拦截器,并提供两个示例,演示如何处理业务异常和系统异常。

二、创建全局异常拦截器

  1. 创建异常处理类

在Spring Boot项目中创建一个异常处理类,用于捕获全局异常。可以继承Spring Boot提供的ResponseEntityExceptionHandler类,并重写handleExceptionInternal方法,自定义处理逻辑:

@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @Override
    protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers,
            HttpStatus status, WebRequest request) {

        String msg = ex.getMessage();
        if (StringUtils.isEmpty(msg)) {
            msg = "服务器异常,请联系管理员!";
        }

        Map<String, Object> result = new HashMap<>();
        result.put("code", status.value());
        result.put("msg", msg);

        return new ResponseEntity<>(result, status);
    }
}
  1. 自定义异常

在项目中定义一个自定义异常,用于抛出业务异常。需要继承RuntimeException类,并在构造方法中传入异常信息:

public class BusinessException extends RuntimeException {

    public BusinessException(String msg) {
        super(msg);
    }
}
  1. 抛出业务异常

在业务代码中抛出自定义异常:

public class UserService {

    public User getById(int id) {
        User user = userRepository.findOne(id);
        if (user == null) {
            throw new BusinessException("用户不存在!");
        }
        return user;
    }
}
  1. 抛出系统异常

在业务代码中抛出系统异常:

public class UserService {

    public void deleteById(int id) {
        int result = userRepository.delete(id);
        if (result == 0) {
            throw new RuntimeException("删除用户失败!");
        }
    }
}

三、运行示例代码

  1. 处理业务异常

使用Spring Boot提供的RestController注解创建一个测试接口:

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public User getById(@PathVariable int id) {
        return userService.getById(id);
    }
}

在访问/user/1时,由于id为1的用户不存在,会抛出自定义的业务异常。全局异常拦截器会捕获并处理该异常,返回以下JSON数据:

{
    "code": 500,
    "msg": "用户不存在!"
}
  1. 处理系统异常

创建另一个测试接口:

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @DeleteMapping("/{id}")
    public String deleteById(@PathVariable int id) {
        userService.deleteById(id);
        return "删除成功!";
    }
}

在访问/user/1时,由于id为1的用户不存在,会抛出系统异常。全局异常拦截器会捕获并处理该异常,返回以下JSON数据:

{
    "code": 500,
    "msg": "删除用户失败!"
}

以上就是使用Spring Boot搭建全局异常拦截的完整攻略。通过自定义异常和全局异常拦截器,我们可以更加优雅地处理程序中出现的各种异常情况,提升应用的健壮性和可维护性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot搭建全局异常拦截 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • Spring boot中PropertySource注解的使用方法详解

    让我对“Spring boot中PropertySource注解的使用方法详解”进行一个详细的介绍。 PropertySource注解的概念 在Spring Boot中,我们使用PropertySource注解来将外部属性文件加载到应用程序中。该注解通常用于指定application.properties文件的位置或自定义属性文件的位置。 PropertyS…

    Java 2023年5月19日
    00
  • Java中两个字符串进行大小比较的方法

    Java中比较两个字符串大小的方法很多,以下是几种常见的方法: 方法一:使用compareTo()方法 Java中的String类有一个compareTo()方法,可以用于比较两个字符串的大小。其返回值为int类型,表示比较结果: 如果前者小于后者,则返回一个负数 如果前者等于后者,则返回0 如果前者大于后者,则返回一个正数 下面是一个实例代码: Strin…

    Java 2023年5月27日
    00
  • java使用socket实现一个多线程web服务器的方法

    使用Java实现一个多线程的Web服务器主要包括以下几步: 1.创建一个ServerSocket对象: 该对象可以监听来自客户端的请求,并将其传递给服务器。 示例代码: ServerSocket serverSocket = new ServerSocket(8080); 2.使用ServerSocket来接受客户端的连接: 服务器监听一个端口,并等待客户端…

    Java 2023年5月18日
    00
  • jsp 编程之@WebServlet详解

    JSP 编程之 @WebServlet 详解 在 JavaWeb 开发中,我们经常需要编写 Servlet 来完成各种需求,而在 Servlet 3.0 版本后,推出了 @WebServlet 注解,可以更方便地编写 Servlet,并且提高了代码的可读性和可维护性。 @WebServlet 注解详解 @WebServlet 注解的作用是将一个类声明为 Se…

    Java 2023年6月15日
    00
  • 详细理解JAVA面向对象的封装,继承,多态,抽象

    JAVA面向对象的基本概念 在Java中,“一切皆对象”,Java程序就是通过面向对象的编程思想来实现的。面向对象的编程思想的核心概念主要包括封装、继承、多态和抽象。这些概念描述了Java对象与类之间的关系和相互作用。 封装 封装是指将数据和行为包装在一起,形成一个类。封装的主要目的是隐藏类的实现细节,只对外部暴露必要的接口,从而达到数据的安全性。 在Jav…

    Java 2023年5月26日
    00
  • java — 标记接口

    标记接口 标记接口(Marker Interface),又称标签接口(Tag Interface) 仅代表一个标记 不包含任何方法标记接口是用来判断某个类是否具有某种能力 Cloneable标记接口 此类实现了 Cloneable 接口,以指示 Object.clone 方法可以合法地对该类实例进行按字段复制如果在没有实现 Cloneable 接口的实例上调…

    Java 2023年4月17日
    00
  • Java多线程编程基石ThreadPoolExecutor示例详解

    Java多线程编程基石ThreadPoolExecutor示例详解 简介 Java的多线程编程需要使用线程池Thread Pool。线程池是一组线程集合,可以被执行多次,且必须共享一份线程队列和一个线程池。ThreadPoolExecutor是Java中一个高级线程池,提供了许多用于线程池管理的功能。本文将详细介绍ThreadPoolExecutor的相关内…

    Java 2023年5月19日
    00
  • Java中的异常处理如何提高程序可维护性?

    关于Java中的异常处理如何提高程序可维护性,我可以提供以下几点建议: 使用合适的异常类型 Java中提供了许多不同类型的异常,包括运行时异常、检查异常等。对于不同的异常情况,应该使用相应的异常类型。比如,对于程序的输入输出操作,可以使用IOException异常;对于数组越界等运行时错误,可以使用IndexOutOfBoundsException异常。使用…

    Java 2023年4月27日
    00
合作推广
合作推广
分享本页
返回顶部