在Spring MVC中使用@ControllerAdvice创建全局异常处理器的方法

 更新时间:2023年08月07日 10:34:01   作者:加辣椒了吗?  
在Spring MVC中,可以使用@ControllerAdvice或@RestControllerAdvice注解来定义全局异常处理器类,并使用 @ExceptionHandler注解来定义处理特定异常的方法,本文就给大家介绍了Spring MVC @ControllerAdvice创建处理器的方法,需要的朋友可以参考下

前言

全局异常处理器是一种机制,用于处理应用程序中发生的异常,无论这些异常在哪个部分发生。它可以拦截和处理整个应用程序范围内的异常,从而实现统一的异常处理逻辑。

在一个应用程序中,可能会有多个控制器处理不同的请求。当这些控制器中抛出异常时,可以使用全局异常处理器来捕获和处理这些异常,而不是在每个控制器中单独处理。

全局异常处理器通常在应用程序的顶层进行定义,以确保能够拦截所有的异常。它可以捕获和处理各种类型的异常,包括应用程序自定义的异常、系统异常和未处理的异常。

使用全局异常处理器的好处包括:

统一异常处理:全局异常处理器可以集中处理所有控制器中出现的异常,避免重复的异常处理代码,提高代码的可维护性和复用性。

自定义异常响应:通过全局异常处理器,可以定义统一的异常响应格式和错误码,使异常的处理更加符合应用的需求。

防止泄露敏感信息:全局异常处理器可以捕获并处理未处理的异常,确保不会向客户端返回敏感信息,同时返回适当的异常信息。

在Spring MVC中,可以使用@ControllerAdvice或@RestControllerAdvice注解来定义全局异常处理器类,并使用 @ExceptionHandler注解来定义处理特定异常的方法。这些方法可以在全局异常处理器类中进行集中管理,提供统一的异常处理逻辑。

希望这样的回答给你带来了一些乐趣和激励!如果你有其他问题,我会很乐意回答。

一、认识注解:@RestControllerAdvice和@ExceptionHandler

当涉及到全局异常处理时,两个重要的注解被广泛使用:@RestControllerAdvice和@ExceptionHandler。

下面是对这两个注解的解释:

@RestControllerAdvice:

(这里插一句:如果你的应用程序使用传统的Web应用程序架构(使用视图解析器渲染视图),则可以使用@ControllerAdvice。而如果你的应用程序是RESTful风格的应用程序,需要直接返回JSON或其他格式的响应体,那么可以使用@RestControllerAdvice。)

@RestControllerAdvice是一个用于定义全局异常处理器的注解。通过将此注解应用于一个类上,该类可以成为一个全局异常处理器。在这个处理器中,你可以定义通用的异常处理逻辑,用于捕获和处理应用程序中的各种异常情况。

@RestControllerAdvice注解的主要作用是:

提供全局异常处理逻辑,捕获应用程序中未被处理的异常。

允许在多个控制器类中共享相同的异常处理逻辑。

可以组合使用其他注解,如@ExceptionHandler、@InitBinder和@ModelAttribute。

@ExceptionHandler:

@ExceptionHandler是一个用于定义特定异常处理方法的注解。通过将此注解应用于处理器类中的方法上,该方法可以被用于处理特定类型的异常。这样,当应用程序抛出匹配的异常时,该方法将被自动调用以处理该异常。

@ExceptionHandler注解的主要作用是:

定义特定异常的处理逻辑,捕获应用程序中抛出的特定类型的异常。

提供更精细的异常处理机制,根据不同的异常类型执行不同的处理代码。

可以在同一个全局异常处理器类中定义多个@ExceptionHandler方法,以处理不同类型的异常。

二、使用步骤

1、封装统一返回结果类

定义返回结果类:后端统一返回结果:

import lombok.Data;
import java.io.Serializable;
/**
 * 后端统一返回结果
 * @param <T>
 */
@Data
public class Result<T> implements Serializable {
    private Integer code; //编码:1成功,0和其它数字为失败
    private String msg; //错误信息
    private T data; //数据
    public static <T> Result<T> success() {
        Result<T> result = new Result<T>();
        result.code = 1;
        return result;
    }
    public static <T> Result<T> success(T object) {
        Result<T> result = new Result<T>();
        result.data = object;
        result.code = 1;
        return result;
    }
    public static <T> Result<T> error(String msg) {
        Result result = new Result();
        result.msg = msg;
        result.code = 0;
        return result;
    }
}

2、自定义异常类封装

封装自定义异常类,用于自定义异常抛出,根据实际情况对业务异常进行更细致和明确的拓展先定义基础异常类:

/**
 * 业务异常
 */
public class BaseException extends RuntimeException {
    public BaseException() {
    }
    public BaseException(String msg) {
        super(msg);
    }
}

再定义自定义异常类:

public class UserNotLoginException extends BaseException {
    public UserNotLoginException() {
    }
    public UserNotLoginException(String msg) {
        super(msg);
    }
}

3、定义全局异常处理类

统一捕获异常:

import com.example.result.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 捕获业务异常
     */
    @ExceptionHandler
    public Result<?> exceptionHandler(BaseException ex){
        return Result.error(ex.getMessage());
    }
	/**
     * 捕获除数为0异常
     */
    @ExceptionHandler
    public Result<?> exceptionHandler(ArithmeticException ex){
        return Result.error("分母不能为0");
    }
    /**
     * 根据异常类型和业务需求,以以下格式继续完善代码
     */
}

根据异常类型和业务需求,可以以以下格式继续完善代码:

 @ExceptionHandler
    public Result<?> exceptionHandler(异常类型 ex){
        return Result.error("异常类型信息");
    }

4、测试

import com.example.result.Result;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class webTest {
	/**
     * 测试捕获业务异常
     */
    @GetMapping("/aa/{id}")
    public Result<?> aa(@PathVariable Long id){
        if(id<2)
            throw new UserNotLoginException("密码错误");
        return Result.success("成功");
    }
    /**
     * 测试捕获除数为0异常
     */
    @GetMapping("/bb")
    public Result<?> bb(){
        int a = 1/0;
        return Result.success("成功");
    }

在这里插入图片描述

在这里插入图片描述

通过以上测试,产生的异常都被全局异常处理器捕获了!!搞定!!!

以上就是在Spring MVC中使用@ControllerAdvice创建全局异常处理器的方法的详细内容,更多关于Spring MVC @ControllerAdvice创建处理器的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot随机数设置及参数间引用的操作步骤

    SpringBoot随机数设置及参数间引用的操作步骤

    在Spring Boot配置文件中设置属性时,除了可以像前面示例中显示的配置属性值外,还可以使用随机值和参数间引用对属性值进行设置。下面给大家介绍SpringBoot参数间引用随机数设置的操作步骤,感兴趣的朋友一起看看吧
    2021-06-06
  • java中toString()、String.valueOf()、(String) 强转的区别

    java中toString()、String.valueOf()、(String) 强转的区别

    在实际开发中,少不了使用这三种方法对某一个类型的数据进行转 String 的操作,本文就来介绍了java中toString()、String.valueOf()、(String) 强转的区别,感兴趣的可以了解一下
    2024-06-06
  • SpringBoot2.0整合Redis自定义注入bean组件配置的实战教程

    SpringBoot2.0整合Redis自定义注入bean组件配置的实战教程

    这篇文章主要介绍了SpringBoot2.0整合Redis自定义注入bean组件配置,我们将基于SpringBoot2.0整合搭建的微服务项目为奠基,开启中间件Redis的实战之路,需要的朋友可以参考下
    2023-06-06
  • springboot多文件上传代码实例及解析

    springboot多文件上传代码实例及解析

    这篇文章主要介绍了springboot多文件上传代码实例及解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • SpringBoot整合Redis使用RedisTemplate和StringRedisTemplate

    SpringBoot整合Redis使用RedisTemplate和StringRedisTemplate

    Spring Boot Data(数据) Redis 中提供了RedisTemplate和StringRedisTemplate,其中StringRedisTemplate是RedisTemplate的子类,两个方法基本一致。本文介绍了SpringBoot整合Redis使用RedisTemplate和StringRedisTemplate的方法,需要的可以参考一下
    2022-12-12
  • Spring Boot 实现Redis分布式锁原理

    Spring Boot 实现Redis分布式锁原理

    这篇文章主要介绍了Spring Boot实现Redis分布式锁原理,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • java线程间通讯的一些方法总结

    java线程间通讯的一些方法总结

    这篇文章主要介绍了java线程间通讯的一些方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Java内存区域管理详解

    Java内存区域管理详解

    这篇文章主要介绍了Java内存区域管理详解,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 教你怎么实现java语言的在线编译

    教你怎么实现java语言的在线编译

    这篇文章主要介绍了教你怎么实现java语言的在线编译,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • Java编程中10个最佳的异常处理技巧

    Java编程中10个最佳的异常处理技巧

    这篇文章主要介绍了Java编程中10个最佳的异常处理技巧,在本文中,将讨论Java异常处理最佳实践,这些Java最佳实践遵循标准的JDK库,和几个处理错误和异常的开源代码,这还是一个提供给java程序员编写健壮代码的便利手册,需要的朋友可以参考下
    2015-01-01

最新评论