在網頁系統操作中常會遇到錯誤的時候,可能是請求錯誤,也有可能是資料錯誤,在遇到這個狀況時,可以自己定義在遇到什麼錯誤時要呈現的訊息,這也就是 Exception Handle。
一般流程:
Postman client ↔(API Call) Controller ↔ Service ↔ (Throw exception ResourceNotFoundException) ↔ Default error handling ↔ Response to Postman client
會要使用一個 GlobalExceptionHandler 來作處理,取代 Default Error handling 的部分
會要使用的註釋:
建立 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 這個 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);
}
}
可以在 Postman 中使用不存在的 Id 測試
就會跑出設定的錯誤訊息:
{
"timestamp" : "....",
"message" : "Post not found with id : ...",
"details": "uri=api/posts/id"
}
今天的紀錄就先到這裡~ 主要記錄了特定 Exception 的實作。
明天將會實作 Global Exception 的部分~