SpringBoot全局异常处理注解

一、@ControllerAdvice注解

在Spring Boot开发中,开发人员通常需要在代码中对异常进行处理。可以使用@ControllerAdvice注解定义一个类,该类中可以定义多个@ExceptionHandler注解方法来实现对全局异常的处理。

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Map handleException(Exception e){
        Map map = new HashMap();
        map.put("code","500");
        map.put("message",e.getMessage());
        return map;
    }
}

使用@ControllerAdvice注解定义的异常处理类,其中使用@ExceptionHandler注解标注的方法可以捕捉到对应的异常类型并进行处理。在上面的例子中,handleException方法捕捉到了Exception类型的异常,并返回了一个Map对象,其中包含了异常的状态码和错误信息。

二、@RestControllerAdvice注解

@RestControllerAdvice注解与@ControllerAdvice注解类似,但是在返回值类型上有所不同。使用@RestControllerAdvice注解定义的异常处理类,其中使用@ExceptionHandler注解标注的方法返回值为Object类型。以下是一个使用@RestControllerAdvice注解的异常处理类的例子:

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    public Object handleException(Exception e){
        Map map = new HashMap();
        map.put("code","500");
        map.put("message",e.getMessage());
        return map;
    }
}

在这个例子中,handleException方法的返回值为Object类型。在方法中,定义了返回值为Map类型的变量map,序列化后返回该变量。

三、@ExceptionHandler注解

除了在@ControllerAdvice或@RestControllerAdvice注解标注的类中使用@ExceptionHandler注解处理异常外,在Controller中也可以使用该注解来处理局部异常。以下是一个Controller中使用@ExceptionHandler注解处理异常的例子:

@RestController
@RequestMapping("/demo")
public class DemoController {

    @ExceptionHandler(value = Exception.class)
    public Map handleException(Exception e){
        Map map = new HashMap();
        map.put("code","500");
        map.put("message",e.getMessage());
        return map;
    }

    @GetMapping("/{id}")
    public Map getDemoById(@PathVariable int id){
        // 模拟获取实体对象的过程
        if(id == 1){
            throw new RuntimeException("ID不能为1");
        }
        Map map = new HashMap();
        map.put("id",id);
        map.put("name","demo");
        return map;
    }
}

在上面的例子中,当Controller的getDemoById方法执行时,如果抛出了RuntimeException异常,handleException方法就会被调用并返回一个Map对象。如果没有抛出异常,则正常返回实体对象。

四、@ResponseStatus注解

@ResponseStatus注解可以用来定义异常的HTTP响应状态码和自定义的异常消息。在Spring Boot开发中,我们可以使用该注解来管理相同类型的异常,并为它们指定相同的HTTP响应状态码和自定义异常信息。以下是一个使用@ResponseStatus注解的例子:

@ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "Forbidden")
public class ForbiddenException extends RuntimeException {
}

在上面的例子中,定义了一个ForbiddenException类,并使用@ResponseStatus注解为该异常定义了返回状态码为403,错误信息为”Forbidden”。

五、结合自定义异常使用

在开发中,我们经常会使用自定义异常来处理业务中的异常情况。这个时候,结合上面介绍的注解进行全局异常处理会更加方便。以下是一个使用自定义异常和全局异常处理注解的例子:

@ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "Forbidden")
public class ForbiddenException extends RuntimeException {
}

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = ForbiddenException.class)
    public Map handleForbiddenException(ForbiddenException e){
        Map map = new HashMap();
        map.put("code","403");
        map.put("message",e.getMessage());
        return map;
    }

    @ExceptionHandler(value = Exception.class)
    public Map handleException(Exception e){
        Map map = new HashMap();
        map.put("code","500");
        map.put("message",e.getMessage());
        return map;
    }
}

@RestController
@RequestMapping("/demo")
public class DemoController {

    @GetMapping("/{id}")
    public Map getDemoById(@PathVariable int id){
        // 模拟获取实体对象的过程
        if(id == 1){
            throw new ForbiddenException();
        }
        Map map = new HashMap();
        map.put("id",id);
        map.put("name","demo");
        return map;
    }
}

在上面的例子中,定义了一个自定义异常ForbiddenException,并使用@ResponseStatus注解为该异常定义了返回状态码为403和错误信息为”Forbidden”。在全局异常处理注解中,分别使用@ExceptionHandler注解处理ForbiddenException和Exception两个异常类型,并分别返回了对应的Map对象。在Controller中,如果抛出了ForbiddenException异常,handleForbiddenException方法就会被调用并返回一个Map对象,如果抛出了其他类型的异常,则调用handleException方法返回Map对象。

六、总结

在Spring Boot开发中,合理使用全局异常处理注解可以避免在代码中出现大量的重复代码。在定义注解时,需注意注解的使用范围和返回值类型。结合自定义异常使用,可更好地管理代码异常情况。

原创文章,作者:BIBJF,如若转载,请注明出处:https://www.506064.com/n/330580.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
BIBJFBIBJF
上一篇 2025-01-16 15:46
下一篇 2025-01-16 15:46

相关推荐

  • Python如何判断质数和异常处理

    本文主要介绍Python如何判断质数和异常处理,其中包括多个方面的内容。 一、判断质数 1、定义:质数是指除了1和它本身两个因数外,没有其他的因数。 2、判断方法: (1)从2到n…

    编程 2025-04-29
  • Hibernate注解联合主键 如何使用

    解答:Hibernate的注解方式可以用来定义联合主键,使用@Embeddable和@EmbeddedId注解。 一、@Embeddable和@EmbeddedId注解 在Hibe…

    编程 2025-04-29
  • 从ga角度解读springboot

    springboot作为目前广受欢迎的Java开发框架,其中的ga机制在整个开发过程中起着至关重要的作用。 一、ga是什么 ga即Group Artifacts的缩写,它是Mave…

    编程 2025-04-29
  • 光模块异常,SFP未认证(entityphysicalindex=6743835)——解决方案和

    如果您遇到类似optical module exception, sfp is not certified. (entityphysicalindex=6743835)的问题,那么…

    编程 2025-04-29
  • 如何使用HTML修改layui内部样式影响全局

    如果您想要使用layui来构建一个美观的网站或应用,您可能需要使用一些自定义CSS来修改layui内部组件的样式。然而,修改layui组件的样式可能会对整个页面产生影响,甚至可能破…

    编程 2025-04-29
  • 数据库第三范式会有删除插入异常

    如果没有正确设计数据库,第三范式可能导致删除和插入异常。以下是详细解释: 一、什么是第三范式和范式理论? 范式理论是关系数据库中的一个规范化过程。第三范式是范式理论中的一种常见形式…

    编程 2025-04-29
  • ROS线程发布消息异常解决方法

    针对ROS线程发布消息异常问题,我们可以从以下几个方面进行分析和解决。 一、检查ROS代码是否正确 首先,我们需要检查ROS代码是否正确。可能会出现的问题包括: 是否正确初始化RO…

    编程 2025-04-28
  • Python OOM异常的原因和解决方法

    Out of Memory(OOM)异常是 Python 程序在内存不足或不足以分配新的对象时,抛出的异常之一。Python 应用程序通常会因为内存瓶颈而崩溃或降低性能,但这并不是…

    编程 2025-04-27
  • Python捕获异常后重新执行的方法

    本文将从捕获异常的基本概念入手,介绍Python中如何捕获异常后重新执行代码的方法,旨在帮助读者更好地理解Python异常处理机制。 一、异常处理机制基础 在Python中,异常处…

    编程 2025-04-27
  • SpringBoot Get方式请求传参用法介绍

    本文将从以下多个方面对SpringBoot Get方式请求传参做详细的阐述,包括URL传参、路径传参、请求头传参、请求体传参等,帮助读者更加深入地了解Get请求方式下传参的相关知识…

    编程 2025-04-27

发表回复

登录后才能评论