為你Springboot項目自定義一個通用的異常
前言
我們的項目通常來講都是一個比較大的項目,包含了各種各樣的服務。如果每個服務都以不同的方式返回異常信息,這樣排查的時候就會比較凌亂。如果我們定義一個標準的異常處理體系。并在所有的服務中使用。那樣開發起來就可以快速定位。頁面也會更加的簡單和直觀。
本文開發環境基于springboot2.4,IDE環境是IDEA。這里從一個最簡單的異常案例。逐步過渡到完全自定義自己的異常。
案例:Springboot查詢數據庫數據,發現返回的是null,就拋出異常。
OK,基于這個思想,看一下實現的思路。
一、簡單案例代碼實現
1、新建一個Springboot應用
2、新建dao包,創建User類
這個比較簡單,代碼如下:
- public class User {
- private int id;
- private String name;
- public User() {
- }
- public User(int id, String name) {
- this.id = id;
- this.name = name;
- }
- //getter和setter方法
- //toString方法
- }
3、新建service包,創建UserService
- @Service
- public class UserService {
- public User findOne(int id){
- //本來應該向數據庫查詢User,但是數據庫沒有
- return null;
- }
- }
由于演示的是異常的案例,因此這里沒有真正實現數據庫的增刪改查操作。當調用findOne方法時,直接返回為null即可。
4、新建controller包,創建UserController類
- @RestController
- public class UserController {
- @Autowired
- private UserService service;
- @GetMapping("/users/{id}")
- public User retriveUser(@PathVariable int id)
- throws UserNotFoundException {
- User user= service.findOne(id);
- if(user==null)
- throw new UserNotFoundException("id: "+ id);
- return user;
- }
- }
這里自定義了一個異常UserNotFoundException,當數據庫查詢的時候一旦發現返回值為null,就直接拋出這個異常。
5、在controller包下,創建UserNotFoundException類
- public class UserNotFoundException extends RuntimeException {
- public UserNotFoundException(String message){
- super(message);
- System.out.println("異常信息是:"+message);
- }
- }
6、postman測試
這時候進行測試會發現服務器代碼會報錯。我們的資源沒有找到總不能提示服務器內部錯誤吧。現在對拋出的異常進行一個處理。
7、異常處理
- @ResponseStatus(HttpStatus.NOT_FOUND)
- public class UserNotFoundException extends RuntimeException {
- public UserNotFoundException(String message){
- super(message);
- System.out.println("異常信息是:"+message);
- }
- }
我們將添加一個注釋@ResponseStatus來生成狀態:404 Not Found。當然還有其他的狀態。這個可以根據自己的需要去返回。我們使用了HttpStatus.NOT_FOUND用戶訪問的時候,一旦拋出了異常就會顯示404錯誤。這個你換成其他的狀態,還會顯示其他的信息。
8、重新測試
Spring Boot和Spring MVC框架的結合提供了錯誤處理。其內部已經自動配置一些默認異常處理。所以在開發中為所有服務配置一致的異常消息是很重要的。
二、通用的異常處理
1、添加依賴
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-webmvc</artifactId>
- <version>5.3.2</version>
- </dependency>
2、創建異常返回實體類ExceptionResponse
這個類的作用是,當有異常時,我們想要展示的信息。
- public class ExceptionResponse {
- private Date timestamp;
- private String message;
- private String detail;
- public ExceptionResponse() { }
- public ExceptionResponse(Date timestamp, String message, String detail) {
- this.timestamp = timestamp;
- this.message = message;
- this.detail = detail;
- }
- public Date getTimestamp() {
- return timestamp;
- }
- public String getMessage() {
- return message;
- }
- public String getDetail() {
- return detail;
- }
- }
這里只需要實現getter方法,setter方法就不需要。
3、創建通用異常處理類
- @ControllerAdvice
- @RestController
- public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
- //此方法主要處理所有的異常信息
- @ExceptionHandler(Exception.class)
- public final ResponseEntity<Object> handleAllExceptions(Exception ex, WebRequest request) {
- //當出現異常時,我們輸出的信息,這里被封裝在了ExceptionResponse
- ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false));
- return new ResponseEntity(exceptionResponse, HttpStatus.INTERNAL_SERVER_ERROR);
- }
- //當頁面資源沒有找到時,拋出的異常
- @ExceptionHandler(UserNotFoundException.class)
- public final ResponseEntity<Object> handleUserNotFoundExceptions(UserNotFoundException ex, WebRequest request) {
- ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false));
- return new ResponseEntity(exceptionResponse, HttpStatus.NOT_FOUND);
- }
- }
很簡單。里面有很多API,可以自己根據需要去查即可。
4、postman測試
萬事大吉。趕快為你的程序自定義一個通用的異常處理程序吧。
本文轉載自微信公眾號「愚公要移山」,可以通過以下二維碼關注。轉載本文請聯系愚公要移山公眾號。