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

yizhihongxing

详解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 如何为文件及文件夹添加权限

    为文件或文件夹添加权限是一个常见的操作,Java可以通过修改文件或文件夹的访问控制列表(ACL)来实现对文件或文件夹的权限控制。为文件或文件夹添加权限的步骤如下: Step 1:创建一个ACL对象 java.nio.file.attribute.AclFileAttributeView类可以用来管理文件或文件夹的ACL。使用Files.getFileAttr…

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

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

    Java 2023年4月27日
    00
  • Hadoop集成Spring的使用详细教程(快速入门大数据)

    下面我会详细讲解“Hadoop集成Spring的使用详细教程(快速入门大数据)”的完整攻略。 概述 Hadoop是大数据处理领域的重要框架,而Spring则是Java开发领域的重要框架,将两者结合起来可以提高大数据处理的效率和可维护性。本教程介绍如何使用Spring集成Hadoop,并提供两个示例:WordCount和PageRank。 环境准备 在开始之前…

    Java 2023年5月19日
    00
  • 使用Java实现系统托盘功能的介绍(附源码以及截图)

    使用Java实现系统托盘功能的介绍(附源码以及截图) 什么是系统托盘功能 系统托盘功能是指将图标置于系统托盘中,以提供快速访问与系统交互的功能,Windows系统右下角的区域就是系统托盘。Java在Swing开发中提供了 TrayIcon 和 SystemTray 两个类来实现该功能。 实现原理 使用 Java 中的 TrayIcon 和 SystemTra…

    Java 2023年5月24日
    00
  • 4种java复制文件的方式

    当需要对文件进行复制操作时,可以采用Java的文件IO流来实现。下面介绍4种Java复制文件的方式。 1.使用FileChannel实现文件复制 通过FileChannel实现文件复制的方式,可以使用FileInputStream、FileOutputStream或RandomAccessFile打开文件通道,使用transferFrom或transferT…

    Java 2023年5月20日
    00
  • java的Hibernate框架报错“DataException”的原因和解决方法

    当使用Java的Hibernate框架时,可能会遇到“DataException”错误。这个错误通常是由于以下原因之一引起的: 数据库类型不匹配:如果您尝试将不兼容的数据类型插入数据库,则可能会出现此错误。在这种情况下,需要检查数据类型并进行必要的更改。 数据库连接问题:如果您的数据库连接存在问题,则可能会出现此错误。在这种情况下,需要检查数据库连接并解决问…

    Java 2023年5月4日
    00
  • Java单链表的实现代码

    下面是关于Java单链表的实现代码的完整攻略: 什么是单链表? 单链表是一种常见的数据结构,它由节点构成,每个节点包括一个数据域和一个指针域,指针指向下一个节点。单链表有头节点和尾节点,头节点不存储具体数据,用于表示单链表的起点,尾节点的指针指向null(空)。 如何实现单链表? 首先,我们要定义单链表的节点: class Node<T> { T…

    Java 2023年5月30日
    00
  • javascript委托(Delegate)blur和focus用法实例分析

    JavaScript 委托(Delegate)blur和focus用法实例分析 在 JavaScript 中,我们常常需要对页面元素添加一些事件,比如 click、mouseover、keyup 等等。但是,如果页面中有很多元素,我们就需要对每个元素都添加事件,这样做会显得很麻烦。所以,JavaScript 委托(Delegate)blur和focus用法应…

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