详解SpringBoot 处理异常的几种常见姿势

详解SpringBoot处理异常的几种常见姿势

在SpringBoot开发中,异常处理是一个非常重要的环节。合理的异常处理能够提高系统的稳定性和可维护性。本文将介绍几种常见的SpringBoot处理异常的姿势。

1. @ControllerAdvice和@ExceptionHandler

@ControllerAdvice是Spring4.0引入的一个注解,它可以用来处理全局的Controller的异常。@ExceptionHandler则是@ControllerAdvice下的注解,用来处理特定异常类型的异常。

代码示例:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(ArithmeticException.class)
    public ModelAndView handleArithmeticException(Exception ex) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("exception", ex);
        mv.setViewName("error/arithmetic");
        return mv;
    }

    @ExceptionHandler(NullPointerException.class)
    public ModelAndView handleNullPointerException(Exception ex) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("exception", ex);
        mv.setViewName("error/null_pointer");
        return mv;
    }
}

在上面的代码中,我们在一个类上加上@ControllerAdvice注解,表示这个类是一个全局异常处理类。然后我们在类中使用@ExceptionHandler注解来处理特定类型的异常。例如,handleArithmeticException方法处理ArithmeticException类型的异常,handleNullPointerException方法处理NullPointerException类型的异常。这两个方法都返回了一个包含异常信息的ModelAndView视图对象。

2. @ResponseStatus

@ResponseStatus注解用来指定处理某种异常时返回的HTTP状态码和异常信息。

代码示例:

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

    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        User user = userRepository.findById(id).orElse(null);
        if (user == null) {
            throw new UserNotFoundException("User not found");
        }
        return user;
    }
}

@ResponseStatus(HttpStatus.NOT_FOUND)
class UserNotFoundException extends RuntimeException {
    public UserNotFoundException(String message) {
        super(message);
    }
}

在上面的代码中,我们在UserNotFoundException类上使用了@ResponseStatus注解,并指定了HTTP状态码为404。这样,当我们在controller中抛出UserNotFoundException类型的异常时,框架会自动返回一个包含异常信息和404状态码的响应结果。

3. ResponseEntity

ResponseEntity是SpringFramework中的一个响应实体类,它可以用来封装响应的HTTP头、HTTP状态码和响应体等信息。

代码示例:

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

    @GetMapping("/{id}")
    public ResponseEntity<?> getUserById(@PathVariable Long id) {
        User user = userRepository.findById(id).orElse(null);
        if (user == null) {
            return ResponseEntity.status(HttpStatus.NOT_FOUND)
                    .body(new ErrorResponse("User not found"));
        }
        return ResponseEntity.ok(user);
    }
}

class ErrorResponse {
    private String message;

    public ErrorResponse(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

在上面的代码中,我们在getUserById方法中使用了ResponseEntity来封装响应结果。当用户不存在时,我们使用ResponseEntity.status(HttpStatus.NOT_FOUND)来设置响应的HTTP状态码;然后再使用.body()设置响应的实体体,即一个包含异常信息的ErrorResponse对象;否则,我们使用ResponseEntity.ok()来设置响应的HTTP状态码为200,同时设置响应体为一个User对象。

小结

在开发SpringBoot应用程序时,异常处理是一个非常重要的环节。合理的异常处理能够提高系统的稳定性和可维护性。在本文中,我们介绍了几种常见的SpringBoot处理异常的姿势,包括@ControllerAdvice和@ExceptionHandler、@ResponseStatus和ResponseEntity。开发者可以根据实际需求选择不同的姿势来处理异常。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解SpringBoot 处理异常的几种常见姿势 - Python技术站

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

相关文章

  • 解析Java中的Field类和Method类

    解析Java中的Field类和Method类攻略 什么是Field类和Method类 Field类和Method类都是Java反射的重要组成部分。Field类代表一个类或者接口的属性(成员变量),Method类代表一个类或者接口中的方法。 使用这两个类可以在运行时获取并操作类或接口中的属性和方法信息。 如何使用Field类 在Java中,每个类都有它的属性(…

    Java 2023年5月26日
    00
  • Jmeter入门教程

    JMeter入门教程 JMeter是一个基于Java开发的功能强大的负载测试工具,被广泛应用于Web应用程序的性能测试、API测试、负载测试等领域。本教程将引导初学者逐步了解JMeter并学会执行基本的负载测试。 安装JMeter 首先,您需要下载并安装最新版本的JMeter。可以从JMeter官方网站(https://jmeter.apache.org/)…

    Java 2023年5月26日
    00
  • Struts2在打包json格式的懒加载异常问题

    当使用Struts2进行json数据懒加载时,有可能会遇到打包json格式的异常问题。这种异常通常是由于Struts2缺少正确的json转换器或配置参数导致的。在本文中,将为您详细讲解如何解决这个问题。 1.检查json-lib库 首先要检查的事项是 json-lib 库, 您需要检查您项目中的 json-lib 包是否正常。 json-lib 库是 Str…

    Java 2023年5月20日
    00
  • java通过实例了解值传递和引用传递

    首先,需要理解Java中两种数据类型传递方式:值传递和引用传递。值传递是指在方法调用时传递的是实际的值,而引用传递则是指传递的是对象的引用。 值传递(Value Passing) Java中的基本数据类型,如int、float、boolean等都是通过值传递的方式进行传递。这意味着,当你将一个基本数据类型作为参数传递给一个方法时,它会复制参数的值,并将其传递…

    Java 2023年5月27日
    00
  • jsp中点击图片弹出文件上传界面及实现预览实例详解

    本文将会详细讲解“jsp中点击图片弹出文件上传界面及实现预览实例详解”的完整攻略。该攻略主要分为两个步骤:实现图片点击上传以及实现图片预览。下面我将分别讲解这两个步骤的具体实现。 实现图片点击上传 对于实现图片点击上传,我们需要用到一个比较流行的JS插件:webuploader。具体实现步骤如下: 1. 引入webuploader库 在jsp页面中引入web…

    Java 2023年6月15日
    00
  • Springboot集成jsp及部署服务器实现原理

    下面我会详细讲解“Springboot集成jsp及部署服务器实现原理”的完整攻略。 1. 集成jsp Spring Boot默认不支持JSP视图,但我们可以通过添加相关依赖和配置来实现JSP视图的支持。 添加相关依赖和配置 在pom.xml文件中添加以下依赖: <dependency> <groupId>org.apache.tomc…

    Java 2023年6月15日
    00
  • MyBatis实现插入大量数据方法详解

    MyBatis实现插入大量数据方法详解 介绍 在实际开发中,可能会遇到需要插入大量数据的情况。如果使用MyBatis默认的SQL语句,会导致多次数据库交互,效率低下。因此,本篇文章将介绍MyBatis如何实现插入大量数据的方法。 使用batch插入 MyBatis提供了批量插入数据的功能,即batch插入。下面是示例代码: <insert id=&qu…

    Java 2023年5月20日
    00
  • java实现flappy Bird小游戏

    下面是详细的“Java实现Flappy Bird小游戏”的完整攻略。 准备工作 在开始之前,需要安装以下软件: Java JDK Eclipse或者IntelliJ IDEA IDE 创建Java项目 首先,需要在IDE中创建一个新的Java项目,然后在该项目中创建一个Main.java文件。 添加游戏资源 接下来,需要在项目中添加所需的Flappy Bir…

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