iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
SideProject30

Java Spring + Vue 甘苦學習路 前後端分離之 Blog 實戰系列 第 20

Day20 Java Spring API 實作 - Exception 處理 Part1

  • 分享至 

  • xImage
  •  

概述

在網頁系統操作中常會遇到錯誤的時候,可能是請求錯誤,也有可能是資料錯誤,在遇到這個狀況時,可以自己定義在遇到什麼錯誤時要呈現的訊息,這也就是 Exception Handle。

一般流程:

Postman client ↔(API Call) Controller ↔ Service ↔ (Throw exception ResourceNotFoundException) ↔ Default error handling ↔ Response to Postman client

會要使用一個 GlobalExceptionHandler 來作處理,取代 Default Error handling 的部分

會要使用的註釋:

  1. @ExceptionHandler
  2. @ControllerAdvice

Payload

建立 ErrorDetails.java 的 class

public class ErrorDetails{
		private Date timestamp;
		private String messsge;
		private String details;
		
	public ErrorDetails(Date timestamp, String message, String details){
			this.timestamp = timestamp;
			this.message = message;
			this.details = details;

}
public Date getTimeStamp(){
			return timestamp;
}

public String getMessage(){
		return message;
}
public String getDetails(){
	return details;
}
}

Exception

在 Exception 這個 package 中新增 GlobalExceptionHandler.java

使用 @ControllerAdvice

@ControllerAdvice
public class GlobalExceptionHandler {
	// 處理特殊的例外狀況
 // 處理 global 狀況

	@ExceptionHandler(ResourceNotFoundException.class)
	// 使用 ResponseEntity 來做回傳的資料結構
	public ResponseEntity<ErrorDetails> handleResourceNotFoundException(ResourceNotFoundException exception, WebRequest webRequest){
			ErrorDetails errorDetails = new ErrorDetails(new Date(), exception.getMessage(), webRequest.getDescription(false));
return new ResponseEntity<>(errorDetails, HttpStatus.NOT_FOUND);

}
// 也可以使用自定義的錯誤類型
	@ExceptionHandler(BlogAPIException.class)
	public ResponseEntity<ErrorDetails> handleResourceNotFoundException(BlogAPIException exception, WebRequest webRequest){
			ErrorDetails errorDetails = new ErrorDetails(new Date(), exception.getMessage(), webRequest.getDescription(false));
return new ResponseEntity<>(errorDetails, HttpStatus.BAD_REQUEST);

}
}

API 測試

可以在 Postman 中使用不存在的 Id 測試

就會跑出設定的錯誤訊息:

{
	"timestamp" : "....",
	"message" : "Post not found with id : ...",
	"details": "uri=api/posts/id"

}

今天的紀錄就先到這裡~ 主要記錄了特定 Exception 的實作。

明天將會實作 Global Exception 的部分~


上一篇
Day19 Java Spring API 實作 - Comment 評論 刪除功能
下一篇
Day21 API Exception 例外處理 Part 2 Global
系列文
Java Spring + Vue 甘苦學習路 前後端分離之 Blog 實戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言