成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring 6/Spring Boot 3新特性:優雅的業務異常處理

開發 前端
當你使用Spring Boot(Spring MVC)進行RESTful API開發的時候,你會發現HTTP的狀態碼很多時候不能足夠有效的傳遞錯誤的信息。

當你使用Spring Boot(Spring MVC)進行RESTful API開發的時候,你會發現HTTP的狀態碼很多時候不能足夠有效的傳遞錯誤的信息。

HTTP里有一個RFC 7807規范:https://www.rfc-editor.org/rfc/rfc7807。這個規范里定義了HTTP API的“問題細節”(Problem Details)內容。

該規范定義了一個“問題細節”(Problem Details),用它來攜帶HTTP錯誤返回信息,避免自定義新的錯誤返回格式。我們通常情況下是自己定義錯誤返回格式的。

Spring 6.0為我們提供了一個org.springframework.http.ProblemDetail 來實現該規范。

RFC 7807是一個很簡單的規范。它定義了一個JSON格式,并關聯了一個媒體類型(media type),這個JSON格式包含了五個可選成員來描述問題細節:

type:一個URI引用,用來識別問題的類型。這個URI的路徑內容應該用來顯示人類可讀的信息來描述類型;

title:人類可讀的問題類型描述;相同類型的問題,應該總是相同的描述;

status:HTTP狀態碼,將它包含在問題細節里是一種方便的方式;

detail:人類可讀的問題實例描述,解釋為什么當前的問題發生在這個特定的場景下;

instance:一個URI引用,用來識別問題實例。這個URI的內容應該用來描述問題實例,但不是必須的。

我們首先建立一個演示項目:

1、通常的業務異常處理方法

定義一個業務異常類。異常含義為:當Person找不到的時候拋出的業務異常。

public class PersonNotFoundException  extends RuntimeException {
@Getter
private final HttpStatus status;

public PersonNotFoundException(String message, HttpStatus status){
super(message);
this.status = status;
}
}

注冊這個業務異常到全局異常處理。

通過在@RestControllerAdvice 中定義全局的切面處理。

通過@ExceptionHandler 來處理指定異常的處理方式。

這里返回的格式就是我們自定義的ErrorMsg格式。我們通過自定義這個ErroMsg完成和接口使用者協議,完成對業務異常的處理。

@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(PersonNotFoundException.class)
public ResponseEntity<ErrorMsg> personNotFoundHandler(PersonNotFoundException e) {
ErrorMsg msg = new ErrorMsg("0000", e.getMessage());
return new ResponseEntity<>(msg, e.getStatus());
}
}

需自定義的錯誤返回

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ErrorMsg {
private String code;
private String msg;
}

測試控制器

@RestController
public class PersonController {

@GetMapping("/getPerson")
public String getPerson(){
throw new PersonNotFoundException("查找的人不存在", HttpStatus.NOT_FOUND);
}
}

啟動程序,訪問:http://localhost:8080/getPerson

2、基于“問題細節”的業務異常處理

基于我們常規的異常處理,其實已經能滿足我們的業務需求,使用RFC 7807規范,我們可以免去自定義的異常錯誤格式(ErrorMsg ),使用Spring 6.0給我們提供的ProblemDetail ,這樣我們以后再無需自己自定義異常返回格式,且在不同的項目之間有了標準,從而客戶端在使用的時候有了可預測性。

Spring 6.0的做法也很簡單,我們只需要將我們自定返回的ErrorMsg 修改成ProblemDetail 即可。我們看一下示例代碼:

@RestControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(PersonNotFoundException.class)
public ProblemDetail personNotFoundHandler(PersonNotFoundException e) {
ProblemDetail problemDetail = ProblemDetail.forStatus(HttpStatus.NOT_FOUND);
problemDetail.setType(URI.create("https://www.toutiao.com/c/user/token/MS4wLjABAAAAJxW0bvHKNNwIpcsocIDAjNHHNXg2yaj1upViHO2JVNw/"));
problemDetail.setTitle("Person Not Found");
problemDetail.setDetail(String.format("錯誤信息:‘%s’", e.getMessage()));
return problemDetail;
}
}

值得說的是ProblemDetail 還支持設置一個Map的properties:

private Map<String, Object> properties;

這樣也為我們的定制擴展提供了更大的空間。

啟動,訪問:http://localhost:8080/getPerson,其實的錯誤返回符合RFC 7807規范。

注意查看返回的頭信息,我們看到了,返回數據的媒體類型為:application/problem+json:

感謝支持我的書:《從企業級開發到云原生微服務:Spring Boot實戰》

參考資料:https://docs.spring.io/spring-framework/docs/6.0.0-RC2/javadoc-api/org/springframework/http/ProblemDetail.html

文章出自:??愛科學的衛斯理??,如有轉載本文請聯系愛科學的衛斯理今日頭條號。

責任編輯:武曉燕 來源: 愛科學的衛斯理
相關推薦

2021-04-20 10:50:38

Spring Boot代碼Java

2024-08-02 09:15:22

Spring捕捉格式

2025-04-16 10:03:40

開發Spring應用程序

2025-02-07 09:11:04

JSON對象策略

2022-04-08 16:27:48

SpringBoot異常處理

2021-09-15 09:02:20

Spring 6Spring BootJava

2021-09-03 06:46:34

Spring 6pring Boot 項目

2020-03-16 17:20:02

異常處理Spring Boot

2024-10-11 11:32:22

Spring6RSocket服務

2024-09-27 12:27:31

2018-06-06 14:30:38

Spring BootApplication事件

2024-12-18 16:19:51

2009-06-18 15:40:07

Spring Batc

2023-09-24 13:55:42

Spring應用程序

2009-06-24 09:22:04

Spring2.5新特

2025-04-27 04:00:00

錯誤頁Spring底層

2025-03-11 00:55:00

Spring停機安全

2025-04-29 07:44:26

配置校驗機制

2018-05-30 15:10:24

Spring BootList類型

2024-05-31 14:06:55

SpringCDSGraalVM
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 高清欧美性猛交xxxx黑人猛交 | 久久精品视频99 | 久久久久久久久国产精品 | 亚洲欧洲中文日韩 | 亚洲综合色视频在线观看 | 欧美视频一区 | 欧美一区二区三区在线 | 久久最新| 亚洲成人网在线播放 | 日韩精品在线一区 | 国产午夜精品视频 | 久在线观看 | 午夜精品一区二区三区在线视频 | 一级免费看 | 九九视频在线观看 | 91精品国产一区二区三区蜜臀 | 国产精品一区二区无线 | 久久久免费毛片 | h在线看| 在线资源视频 | 一区二区av | 一区二区三区在线免费观看视频 | 国产精品视频久久久久久 | 99精品欧美一区二区三区综合在线 | 超碰520| 国产欧美精品区一区二区三区 | 国产乱码精品一区二区三区五月婷 | 五月婷亚洲 | 精品国产乱码久久久久久图片 | 欧美激情在线观看一区二区三区 | 精品国产一区久久 | 91人人爽| 精品一区二区三区在线观看 | 成人精品视频在线观看 | 一区二区精品 | 日韩网站在线观看 | 超碰在线亚洲 | 欧美综合一区二区 | 国产日韩精品一区 | 一区二区精品 | 国产一区二区三区在线 |