为你Springboot项目自定义一个通用的异常

开发 项目管理
我们的项目通常来讲都是一个比较大的项目,包含了各种各样的服务。如果每个服务都以不同的方式返回异常信息,这样排查的时候就会比较凌乱。

[[373931]]

前言

我们的项目通常来讲都是一个比较大的项目,包含了各种各样的服务。如果每个服务都以不同的方式返回异常信息,这样排查的时候就会比较凌乱。如果我们定义一个标准的异常处理体系。并在所有的服务中使用。那样开发起来就可以快速定位。页面也会更加的简单和直观。

本文开发环境基于springboot2.4,IDE环境是IDEA。这里从一个最简单的异常案例。逐步过渡到完全自定义自己的异常。

案例:Springboot查询数据库数据,发现返回的是null,就抛出异常。

OK,基于这个思想,看一下实现的思路。

一、简单案例代码实现

1、新建一个Springboot应用

2、新建dao包,创建User类

这个比较简单,代码如下:

  1. public class User { 
  2.     private int id; 
  3.     private String name
  4.     public User() { 
  5.     } 
  6.     public User(int id, String name) { 
  7.         this.id = id; 
  8.         this.name = name
  9.     } 
  10.     //getter和setter方法 
  11.     //toString方法 

3、新建service包,创建UserService

  1. @Service 
  2. public class UserService { 
  3.     public User findOne(int id){ 
  4.         //本来应该向数据库查询User,但是数据库没有 
  5.         return null
  6.     } 

由于演示的是异常的案例,因此这里没有真正实现数据库的增删改查操作。当调用findOne方法时,直接返回为null即可。

4、新建controller包,创建UserController类

  1. @RestController 
  2. public class UserController { 
  3.     @Autowired 
  4.     private UserService service; 
  5.     @GetMapping("/users/{id}"
  6.     public User retriveUser(@PathVariable int id)  
  7.             throws UserNotFoundException { 
  8.         User user= service.findOne(id); 
  9.         if(user==null
  10.             throw new UserNotFoundException("id: "+ id); 
  11.         return user
  12.     } 

这里自定义了一个异常UserNotFoundException,当数据库查询的时候一旦发现返回值为null,就直接抛出这个异常。

5、在controller包下,创建UserNotFoundException类

  1. public class UserNotFoundException extends RuntimeException { 
  2.     public UserNotFoundException(String message){ 
  3.         super(message); 
  4.         System.out.println("异常信息是:"+message); 
  5.     } 

6、postman测试

这时候进行测试会发现服务器代码会报错。我们的资源没有找到总不能提示服务器内部错误吧。现在对抛出的异常进行一个处理。

7、异常处理

  1. @ResponseStatus(HttpStatus.NOT_FOUND) 
  2. public class UserNotFoundException extends RuntimeException { 
  3.     public UserNotFoundException(String message){ 
  4.         super(message); 
  5.         System.out.println("异常信息是:"+message); 
  6.     } 

我们将添加一个注释@ResponseStatus来生成状态:404 Not Found。当然还有其他的状态。这个可以根据自己的需要去返回。我们使用了HttpStatus.NOT_FOUND用户访问的时候,一旦抛出了异常就会显示404错误。这个你换成其他的状态,还会显示其他的信息。

8、重新测试

Spring Boot和Spring MVC框架的结合提供了错误处理。其内部已经自动配置一些默认异常处理。所以在开发中为所有服务配置一致的异常消息是很重要的。

二、通用的异常处理

1、添加依赖

  1. <dependency> 
  2.       <groupId>org.springframework</groupId> 
  3.       <artifactId>spring-webmvc</artifactId> 
  4.       <version>5.3.2</version> 
  5. </dependency> 

2、创建异常返回实体类ExceptionResponse

这个类的作用是,当有异常时,我们想要展示的信息。

  1. public class ExceptionResponse { 
  2.     private Date timestamp
  3.     private String message; 
  4.     private String detail; 
  5.     public ExceptionResponse() { } 
  6.     public ExceptionResponse(Date timestamp, String message, String detail) { 
  7.         this.timestamp = timestamp
  8.         this.message = message; 
  9.         this.detail = detail; 
  10.     } 
  11.     public Date getTimestamp() { 
  12.         return timestamp
  13.     } 
  14.     public String getMessage() { 
  15.         return message; 
  16.     } 
  17.     public String getDetail() { 
  18.         return detail; 
  19.     } 

这里只需要实现getter方法,setter方法就不需要。

3、创建通用异常处理类

  1. @ControllerAdvice 
  2. @RestController 
  3. public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler { 
  4.  
  5.     //此方法主要处理所有的异常信息 
  6.     @ExceptionHandler(Exception.class) 
  7.     public final ResponseEntity<Object> handleAllExceptions(Exception ex, WebRequest request) { 
  8.         //当出现异常时,我们输出的信息,这里被封装在了ExceptionResponse 
  9.         ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false)); 
  10.         return new ResponseEntity(exceptionResponse, HttpStatus.INTERNAL_SERVER_ERROR); 
  11.     } 
  12.     //当页面资源没有找到时,抛出的异常 
  13.     @ExceptionHandler(UserNotFoundException.class) 
  14.     public final ResponseEntity<Object> handleUserNotFoundExceptions(UserNotFoundException ex, WebRequest request) { 
  15.         ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false)); 
  16.         return new ResponseEntity(exceptionResponse, HttpStatus.NOT_FOUND); 
  17.     } 

很简单。里面有很多API,可以自己根据需要去查即可。

4、postman测试

万事大吉。赶快为你的程序自定义一个通用的异常处理程序吧。

本文转载自微信公众号「愚公要移山」,可以通过以下二维码关注。转载本文请联系愚公要移山公众号。

 

 

责任编辑:武晓燕 来源: 愚公要移山
相关推荐

2009-04-28 13:25:36

Ajax函数Java

2021-01-07 05:24:38

SpringbootSpringBanner

2012-11-19 11:07:42

IBMdw

2011-12-16 14:23:51

Java

2023-07-03 08:29:11

BannerSpringBoot

2022-06-06 09:28:36

ReactHook

2019-07-07 10:00:00

Linux系统托盘指示器

2019-07-05 14:20:10

Linux系统托盘

2023-11-22 09:45:44

2021-03-09 15:23:45

鸿蒙HarmonyOS应用开发

2020-09-18 10:12:24

KotlinTCP网络协议

2021-02-23 08:01:01

HooksReact架构

2017-06-20 12:48:55

React Nativ自定义模块Note.js

2014-11-12 10:26:25

Bootstrap

2021-06-17 06:52:37

C#自定义异常

2024-11-27 16:38:07

2023-10-11 07:57:23

springboot微服务

2009-08-03 16:37:49

C#异常类

2020-09-07 09:54:01

GNOME桌面主题桌面应用

2024-08-01 17:20:55

点赞
收藏

51CTO技术栈公众号