日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Spring6/SpringBoot3新特性:優(yōu)雅的業(yè)務(wù)異常處理

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

創(chuàng)新互聯(lián)基于成都重慶香港及美國等地區(qū)分布式IDC機房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)服務(wù)器托管機柜報價,主機托管價格性價比高,為金融證券行業(yè)服務(wù)器托管,ai人工智能服務(wù)器托管提供bgp線路100M獨享,G口帶寬及機柜租用的專業(yè)成都idc公司。

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

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

Spring 6.0為我們提供了一個org.springframework.http.ProblemDetail 來實現(xiàn)該規(guī)范。

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

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

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

status:HTTP狀態(tài)碼,將它包含在問題細節(jié)里是一種方便的方式;

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

instance:一個URI引用,用來識別問題實例。這個URI的內(nèi)容應(yīng)該用來描述問題實例,但不是必須的。

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

1、通常的業(yè)務(wù)異常處理方法

定義一個業(yè)務(wù)異常類。異常含義為:當(dāng)Person找不到的時候拋出的業(yè)務(wù)異常。

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

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

注冊這個業(yè)務(wù)異常到全局異常處理。

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

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

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

@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(PersonNotFoundException.class)
public ResponseEntity 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、基于“問題細節(jié)”的業(yè)務(wù)異常處理

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

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 還支持設(shè)置一個Map的properties:

private Map properties;

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

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

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

感謝支持我的書:《從企業(yè)級開發(fā)到云原生微服務(wù):Spring Boot實戰(zhàn)》

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

文章出自:??愛科學(xué)的衛(wèi)斯理??,如有轉(zhuǎn)載本文請聯(lián)系愛科學(xué)的衛(wèi)斯理今日頭條號。


本文名稱:Spring6/SpringBoot3新特性:優(yōu)雅的業(yè)務(wù)異常處理
本文來源:http://www.dlmjj.cn/article/dhihcig.html