首页 > 其他分享 >Spring Boot:轻松设置全局异常处理

Spring Boot:轻松设置全局异常处理

时间:2024-07-02 18:58:54浏览次数:20  
标签:处理 Spring Boot 全局 异常 public

Spring Boot:轻松设置全局异常处理

在软件开发中,异常处理是一项至关重要的任务。对于使用Spring Boot的开发者来说,设置全局异常处理不仅可以提高代码的整洁度,还可以提升用户体验。本文将详细介绍如何在Spring Boot中轻松设置全局异常处理,并涵盖一些相关的Spring Boot特性,如国际化支持和分布式系统架构。

一、异常处理基础

在Java编程中,异常处理是通过try-catch块来实现的。当一个方法在执行过程中遇到异常情况时,它会抛出一个异常对象。这个对象既可以是Java标准库中定义的异常类(如NullPointerException),也可以是自定义的异常类。

在Spring Boot应用中,异常可能发生在多个层级,包括控制器(Controller)、服务(Service)和数据访问层(DAO)。为了有效地处理这些异常,我们需要一个全局的异常处理机制。

二、Spring Boot中的全局异常处理

Spring Boot提供了一种非常简便的方式来设置全局异常处理,那就是使用@ControllerAdvice注解。通过这个注解,我们可以创建一个全局异常处理器,它能够捕获并处理应用中抛出的所有异常。

1. 创建全局异常处理器

首先,我们需要创建一个类,并使用@ControllerAdvice注解来标记它。这个类可以包含多个方法,每个方法都使用@ExceptionHandler注解来指定它能够处理的异常类型。

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    public ResponseEntity<Object> handleException(Exception e) {
        // 构建异常响应
        ApiError apiError = new ApiError(HttpStatus.INTERNAL_SERVER_ERROR, e.getMessage(), e);
        return new ResponseEntity<>(apiError, HttpStatus.INTERNAL_SERVER_ERROR);
    }

    // 可以添加更多的异常处理方法
}

在上面的代码中,GlobalExceptionHandler类使用了@ControllerAdvice注解,这意味着它是一个全局异常处理器。handleException方法使用了@ExceptionHandler注解,并指定了它能够处理Exception.class类型的异常。当应用中抛出任何Exception类型的异常时,这个方法都会被调用。

2. 自定义异常响应

在全局异常处理器中,我们可以自定义异常响应的格式。在上面的代码中,我们创建了一个ApiError类来表示异常响应。这个类包含了HTTP状态码、错误消息和异常对象。

public class ApiError {

    private HttpStatus status;
    private String message;
    private Throwable error;

    public ApiError(HttpStatus status, String message, Throwable error) {
        this.status = status;
        this.message = message;
        this.error = error;
    }

    // 省略getter和setter方法
}

通过自定义异常响应,我们可以向客户端提供更丰富的错误信息,从而帮助他们更好地理解和解决问题。

3. 异常处理策略

在全局异常处理器中,我们可以根据不同的异常类型制定不同的处理策略。例如,对于业务异常,我们可以返回特定的错误码和错误信息;对于系统异常,我们可以记录日志并返回通用的错误信息。

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = BusinessException.class)
    public ResponseEntity<Object> handleBusinessException(BusinessException e) {
        // 构建业务异常响应
        ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST, e.getMessage(), e);
        return new ResponseEntity<>(apiError, HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler(value = Exception.class)
    public ResponseEntity<Object> handleException(Exception e) {
        // 记录日志
        logger.error("系统异常:", e);
        // 构建系统异常响应
        ApiError apiError = new ApiError(HttpStatus.INTERNAL_SERVER_ERROR, "系统异常,请联系管理员", e);
        return new ResponseEntity<>(apiError, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

在上面的代码中,我们为业务异常和系统异常分别制定了不同的处理策略。对于业务异常,我们返回400状态码和特定的错误信息;对于系统异常,我们记录日志并返回500状态码和通用的错误信息。

三、异常传递方式

在Spring Boot中,异常可以在不同的层级之间传递。当一个方法抛出异常时,如果这个异常没有被当前方法捕获和处理,那么它会被传递到调用栈中的上一层方法。如果上一层方法也没有捕获和处理这个异常,那么异常会继续向上传递,直到被全局异常处理器捕获和处理。

这种异常传递方式使得我们可以在全局异常处理器中统一处理应用中抛出的所有异常,而无需在每个方法中都编写异常处理代码。

四、Spring Boot的其他相关特性

除了全局异常处理之外,Spring Boot还提供了许多其他有用的特性,如国际化支持和分布式系统架构。

1. 国际化支持

Spring Boot提供了强大的国际化支持,使得我们可以轻松地构建多语言应用。通过配置消息源(Message Source)和区域设置解析器(Locale Resolver),我们可以实现根据用户的语言偏好来显示不同的消息。

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:messages");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }

    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver localeResolver = new SessionLocaleResolver();
        localeResolver.setDefaultLocale(Locale.US);
        return localeResolver;
    }
}

在上面的代码中,我们配置了一个消息源和一个区域设置解析器。消息源加载了位于classpath:messages路径下的消息文件,而区域设置解析器则根据用户的会话来确定其语言偏好。

2. 分布式系统架构

Spring Boot也非常适合构建分布式系统。通过使用Spring Cloud等框架,我们可以轻松地实现服务发现、负载均衡、配置管理等分布式系统架构的关键组件。

例如,我们可以使用Spring Cloud Netflix Eureka来实现服务发现。Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。

@SpringBootApplication
@EnableEurekaClient
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

在上面的代码中,我们通过@EnableEurekaClient注解将应用注册为Eureka客户端,这样它就可以被其他服务发现了。

五、总结

在Spring Boot中设置全局异常处理是一项非常重要的任务。通过使用@ControllerAdvice注解和@ExceptionHandler注解,我们可以轻松地创建一个全局异常处理器来捕获并处理应用中抛出的所有异常。此外,Spring Boot还提供了许多其他有用的特性,如国际化支持和分布式系统架构,这些特性可以帮助我们构建更加健壮、可扩展和易于维护的应用。

标签:处理,Spring,Boot,全局,异常,public
From: https://blog.csdn.net/qq_33851668/article/details/140094211

相关文章

  • SpringAMQP
    快速入门在之前的案例中,我们都是经过交换机发送消息到队列,不过有时候为了测试方便,我们也可以直接向队列发送消息,跳过交换机。在入门案例中,我们就演示这样的简单模型,如图:也就是:publisher直接发送消息到队列消费者监听并处理队列中的消息:::warning注意:这种模式一般测试使......
  • SpringBoot在线软考考试管理系统(报告+源码+数据库)
    系统功能        基于SpringBoot框架的在线考试系统是一个集用户管理、权限控制[4]、试题管理、在线考试、成绩管理等功能于一体的综合性系统。该系统在构建时充分考虑了现代Web应用的最佳实践,采用了前后端分离架构,使得前端与后端能够各自独立开发、部署和扩展,通过......
  • 【Spring Boot】Spring AOP中的环绕通知
    目录一、什么是AOP?二、AOP的环绕通知2.1切点以及切点表达式2.2连接点2.3通知(Advice)2.4切面(Aspect)2.5不同通知类型的区别2.5.1正常情况下2.5.2异常情况下2.6统一管理切点@PointCut一、什么是AOP?AspectOrientedProgramming(面向切面编程)AOP是Spring框......
  • 基于springboot用“异常处理器“捕获解决“数据库信息录入重复“的问题“SQLIntegrity
    前言 当我们编写后端时,会遇到一个问题,那就是:假如A用户向我们的数据库录入完登录信息后(姓名,账号等),B用户同样采用了一个相同的姓名提交了登录信息,那这个时候就不满足username的唯一约束,此时数据库就会报错例如报错如下:Duplicateentry'····'forkey'····'提示......
  • maven构建断网springboot
    maven构建断网springboot我的依赖仓库(本地电脑,记住常用的那几个)org.springframework.boot下的spring-boot-starter-parentspring-boot-starter-web/Users/lin/Documents/repo使用maven进行创建空白项目在pom.xml中补全parent类parent groupId artifactId vers......
  • Bootstrap/布局
    Bootstrap/布局目录Bootstrap/布局断点容器网格列沟槽null断点BreakpointClassinfixDimensionsExtrasmallNone<576pxSmallsm≥576pxMediummd≥768pxLargelg≥992pxExtralargexl≥1200pxExtraextralargexxl≥1400px容器容器可以......
  • SpringBoot3连接Mysql数据库
    pom引入包,启动器<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.o......
  • 怎么彻底关闭Nacos?解决启动时Spring连接Nacos报错
    NacosNacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是阿里巴巴开源的一个项目,旨在帮助您发现、配置和管理微服务。Nacos提供了一系列丰富的特性集合,支持服务发现和服务健康监测、动态配置服务、服务元数据和流量管理等功能。主要功能服务......
  • Spring Boot 中使用 Spring Security 实现安全访问权限管理:详尽指南
    引言:在现代Web应用开发中,安全是一个至关重要的环节。SpringSecurity是一个功能强大且高度可定制的安全框架,能够为SpringBoot应用提供全面的安全解决方案,包括认证(Authentication)和授权(Authorization)。本文将手把手教你如何在SpringBoot应用中集成SpringSecurity,实现用户登......
  • SpringBoot+mail 轻松实现各类邮件自动推送
    一、简介在实际的项目开发过程中,经常需要用到邮件通知功能。例如,通过邮箱注册,邮箱找回密码,邮箱推送报表等等,实际的应用场景非常的多。早期的时候,为了能实现邮件的自动发送功能,通常会使用JavaMail相关的api来完成。后来Spring推出的JavaMailSender工具,进一步简化了邮件的......