详解SpringBoot中的统一异常处理

下面我将为你详细讲解“详解SpringBoot中的统一异常处理”的完整攻略。

什么是SpringBoot中的统一异常处理

在SpringBoot中,我们经常需要对抛出的异常进行统一处理。如果我们每个地方都去捕捉异常,并进行相应处理,那么代码量会非常大。此时,我们可以使用SpringBoot中的统一异常处理,将所有异常集中处理,大大减少了代码量,也方便了我们对异常的管理。

怎么使用SpringBoot中的统一异常处理

1.引入异常处理的依赖

在pom.xml中添加spring-boot-starter-web依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.定义一个统一异常处理类

在SpringBoot中,我们可以通过@ControllerAdvice注解定义一个统一异常处理类。

@ControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 参数校验异常处理方法
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        return Result.failure(e.getBindingResult().getFieldError().getDefaultMessage());
    }

    /**
     * 全局异常处理方法
     */
    @ExceptionHandler(Exception.class)
    @ResponseBody
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public Result handleException(Exception e) {
        return Result.failure("系统出现错误,请联系管理员!");
    }

}

在上述代码中,我们使用了@ExceptionHandler注解对两类异常进行了处理。

  • MethodArgumentNotValidException:参数校验异常处理方法,我们在该方法中获取到校验失败的信息,并返回给前端。
  • Exception:全局异常处理方法,我们在该方法中返回了一个默认的错误信息。

3.定义一个返回统一数据格式的对象

在进行异常处理时,我们一般需要返回一个统一的数据格式。为了方便处理,我们可以定义一个Result对象,并在异常处理方法中返回该对象。

public class Result {
    private int code;
    private String message;
    private Object data;

    public Result(int code, String message, Object data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    public static Result success(Object data) {
        return new Result(200, "success", data);
    }

    public static Result failure(String message) {
        return new Result(500, message, null);
    }

    // getters and setters
}

在上述代码中,我们定义了一个Result对象,该对象包含了code、message和data三个属性,并提供了两个静态方法success和failure。通过success方法,我们可以创建一个成功的Result对象,并将数据设置到data属性中;通过failure方法,我们可以创建一个失败的Result对象,并将错误信息设置到message属性中。

4.在Controller中抛出异常

现在,我们已经定义好了统一异常处理类和统一数据格式,接下来我们需要在Controller中抛出异常,然后交由统一异常处理类去处理。示例代码如下:

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

    @Autowired
    private UserService userService;

    @PostMapping("/login")
    public Result login(@RequestBody User user) {
        User result = userService.login(user);
        if(result == null) {
            throw new RuntimeException("用户名或密码错误!");
        }
        return Result.success(result);
    }
}

在上述代码中,我们在login方法中抛出了一个RuntimeException异常,并设置了异常信息。

5.测试异常处理

现在,我们已经完成了SpringBoot中的统一异常处理的配置,接下来我们需要进行测试。我们可以在Controller中故意抛出异常,然后查看返回数据是否符合我们的预期。下面是一个测试示例:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserControllerTest {
    @Autowired
    private MockMvc mvc;

    @Test
    public void testLogin() throws Exception {
        JSONObject json = new JSONObject();
        json.put("username", "admin");
        json.put("password", "123456");

        String content = json.toJSONString();

        mvc.perform(MockMvcRequestBuilders.post("/api/user/login")
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .content(content))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.code").value(500))
                .andExpect(jsonPath("$.message").value("用户名或密码错误!"));
    }
}

在上述示例中,我们使用了MockMvc进行测试,模拟了一次/login接口的请求,并故意使用错误的用户名和密码。如果返回的数据为500状态码,并且message为“用户名或密码错误!”,则意味着我们的异常处理已经生效。

示例说明

上述示例中,我们展示了如何使用SpringBoot中的统一异常处理,实现了对全局异常和参数校验异常的处理。我们定义了一个统一的数据格式Result,并在Controller中抛出异常。当异常发生时,统一异常处理类会捕获异常,并将处理结果返回给前端。在测试中,我们模拟了一个非法请求,测试了我们的异常处理流程是否生效,结果也符合我们的预期。

另外一个示例是,在Spring Boot应用中使用了JdbcTemplate进行数据库操作时,当操作失败时,需要对抛出的SQLException进行处理。我们也可以在GlobalExceptionHandler中定义一个SQLException处理方法,来捕获SQLException,并返回一个统一的数据格式Result。

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

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

相关文章

  • spring security在分布式项目下的配置方法(案例详解)

    下面为大家详细讲解Spring Security在分布式项目下的配置方法。 1、什么是Spring Security Spring Security 是一个基于 Spring 为后台应用程序提供认证和授权的框架,支持常见的认证和授权技术,并且易于扩展。它能够保护 Web 应用程序及其服务,提供认证和授权相关的附加功能,如密码编码、Single Sign On…

    Java 2023年5月20日
    00
  • java实现文件打包压缩输出到浏览器下载

    下面是Java实现文件打包压缩输出到浏览器下载的详细攻略。 一、引入相关依赖 我们需要使用Java自带的ZipOutputStream类和ServletOutputStream类来实现文件压缩和下载功能。 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; impo…

    Java 2023年5月26日
    00
  • jquery ajaxfileupload异步上传插件

    jquery ajaxfileupload异步上传插件是一款可以在页面上实现文件异步上传的插件,可以帮助我们更方便地实现文件上传功能,并且使用方便、易于操作。下面是这款插件的完整攻略: 一、安装和引用 jquery ajaxfileupload异步上传插件可以使用npm包管理器进行安装,也可以使用CDN引入。以下是使用CDN引入的方法: <script…

    Java 2023年5月20日
    00
  • 利用spring-data-redis实现incr自增的操作

    下面就是“利用spring-data-redis实现incr自增的操作”的完整攻略: 1. 环境准备 在开始之前,你需要确保已经具备以下条件: JDK 1.8以上 Maven Redis数据库 Spring Boot 2以上版本 如果还没有安装Redis数据库,你可以到官网下载安装包进行安装。在安装完成之后,你需要启动Redis服务,在配置文件中修改Redi…

    Java 2023年5月20日
    00
  • Java线程中断的本质深入理解

    Java线程中断的本质深入理解 Java中断是一种非常有用的工具,它可以停止正在运行的线程。然而,这个过程并不总是那么简单。 理解线程中断 线程中断可以被认为是设置一个标志,让线程知道它应该停止执行。线程可以使用isInterrupted()方法来检查标志是否被设置。也可以使用Thread.interrupted()方法来检查标志并清除它。 例如,以下代码段…

    Java 2023年5月26日
    00
  • 基于Java Tomcat和激活MyEclips的深入理解

    基于Java Tomcat和激活MyEclipse的深入理解攻略 1. 安装Java Tomcat Java Tomcat是一款开源的Web服务器,支持Servlet和JavaServer Pages(JSP)技术。安装Java Tomcat十分简单,我们只需要到官网下载页面,下载我们需要的版本,然后解压即可。 2. 激活MyEclipse MyEclips…

    Java 2023年6月2日
    00
  • Java过滤器与监听器间区别与联系

    Java过滤器与监听器的区别和联系 本文主要讲解Java Web中过滤器和监听器的区别和联系。过滤器(Filter)和监听器(Listener)都可以通过Web.xml进行配置,并且也可以通过注解的方式进行配置。 过滤器(Filter) 过滤器是在请求被处理之前对http请求和response进行预处理的技术,它可以拦截客户端发送的请求和服务器返回的响应,同…

    Java 2023年6月15日
    00
  • springboot post接口接受json时,转换为对象时,属性都为null的解决

    当使用 Spring Boot 框架编写 POST 接口用于接收 JSON 数据时,有时候会遇到将 JSON 转换为对象时,属性都为 null 的问题,这可能是由于参数名称或字段名称不匹配导致的。我们可以通过以下步骤来解决这个问题。 第一步:确认参数名称和字段名称是否匹配 确保接口定义的参数名称和 JSON 数据中的字段名称完全相同。如果不同,Spring …

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