




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 PAGE 1在Spring WebFlux中處理錯(cuò)誤 PAGE 6在Spring WebFlux中處理錯(cuò)誤概覽在本教程中,我們通過(guò)一個(gè)實(shí)際的例子來(lái)看一下可用于處理Spring WebFlux項(xiàng)目中的錯(cuò)誤的各種策略。我們還將指出在哪種情況下使用一種策略會(huì)比另外一種好,在本文最后將提供所有源碼的下載地址。配置實(shí)例上一篇文章 HYPERLINK /spring-webflux previous article 中已經(jīng)提到了maven的配置, 并對(duì) Spring Webflux做了簡(jiǎn)單的介紹。在這個(gè)例子中,我們?yōu)橐粋€(gè) RESTful 端點(diǎn)加上一個(gè)名為 username 的查詢參數(shù),并以“Hello
2、username”作為結(jié)果返回。First, lets create a router function that routes the /hello request to a method named handleRequest in the passed-in handler:首先,讓我們創(chuàng)建一個(gè)路由器函數(shù),將/hello請(qǐng)求路由名為handleRequest的方法中:Beanpublic RouterFunction routeRequest(Handler handler) return RouterFunctions.route(RequestPredicates.GET(/hell
3、o).and(RequestPredicates.accept(MediaType.TEXT_PLAIN), handler:handleRequest);接下來(lái),我們將定義handleRequest()方法,該方法調(diào)用sayHello()方法并在ServerResponse主體中包 含/返回其結(jié)果的方法:public Mono handleRequest(ServerRequest request) return/.sayHello(request)/.最后,sayHello()是一個(gè)簡(jiǎn)單的實(shí)用工具方法,它將“Hello”和 username 連接起來(lái)返回。private Mono sayH
4、ello(ServerRequest request) /.return Mono.just(Hello, + request.queryParam(name).get();/.只要用 username 作為我們請(qǐng)求的一部分存在,例如使用“/hello?username=Tonni”訪問(wèn),我們的端點(diǎn)就可以正確運(yùn)行。然而,如果我們調(diào)用/hello的時(shí)候沒(méi)有使用 username 這個(gè)參數(shù),它會(huì)拋出一個(gè)異常。下面,我們將看看我們?cè)诤翁幦绾沃匦陆M織我們的代碼才能在WebFlux中處理此異常。在函數(shù)級(jí)別處理錯(cuò)誤Mono和Flux API內(nèi)置了兩個(gè)關(guān)鍵操作符,用于處理功能級(jí)別的錯(cuò)誤。讓我們簡(jiǎn)要地探討它們
5、及其用法。使用 onErrorReturn當(dāng)出現(xiàn)錯(cuò)誤時(shí),我們可以使用 onErrorReturn()來(lái)返回一個(gè)靜態(tài)的默認(rèn)值。public Mono handleRequest(ServerRequest request) return sayHello(request).onErrorReturn(Hello Stranger).flatMap(s - ServerResponse.ok().contentType(MediaType.TEXT_PLAIN).syncBody(s);當(dāng) sayHello()拋出異常時(shí),函數(shù)就會(huì)默認(rèn)返回Hello Stranger。使用onErrorResume
6、使用onErrorResume處理錯(cuò)誤有三種方式:計(jì)算動(dòng)態(tài)返回值使用fallback方法 跳轉(zhuǎn)到備份路徑public Mono handleRequest(ServerRequest request) return sayHello(request).flatMap(s - ServerResponse.ok().contentType(MediaType.TEXT_PLAIN).syncBody(s).onErrorResume(e - Mono.just(Error + e.getMessage()捕獲,包裝和重新拋出錯(cuò)誤,例如 作為自定義業(yè)務(wù)異常讓我們看看怎么楊計(jì)算一個(gè)值:.flatMa
7、p(s - ServerResponse.ok().contentType(MediaType.TEXT_PLAIN).syncBody(s);在這里,每當(dāng)sayHello()拋出異常時(shí),我們將返回一個(gè)字符串,該字符串由附加到字符串“Error”的動(dòng)態(tài)獲取的錯(cuò)誤消息組成。接下來(lái),當(dāng)錯(cuò)誤發(fā)生時(shí)我們調(diào)用 fallback 方法:public Mono handleRequest(ServerRequest request) return sayHello(request).flatMap(s - ServerResponse.ok().contentType(MediaType.TEXT_PLAI
8、N).syncBody(s).onErrorResume(e - sayHelloFallback().flatMap(s -; ServerResponse.ok().contentType(MediaType.TEXT_PLAIN).syncBody(s);在這里,只要sayHello()拋出異常,我們就會(huì)調(diào)用替代方法sayHelloFallback()。使用onErrorResume()的最后一個(gè)選項(xiàng)是捕獲,包裝和重新拋出錯(cuò)誤,例如 作為NameRequiredException:public Mono handleRequest(ServerRequest request) retur
9、n ServerResponse.ok().body(sayHello(request).onErrorResume(e - Mono.error(new NameRequiredException( HttpStatus.BAD_REQUEST,username is required, e), String.class);在這里,只要sayHello()拋出異常,我們就會(huì)拋出一個(gè)自定義異常,并帶有消息:username is required。全局級(jí)別的錯(cuò)誤處理到目前為止,我們提供的所有示例都在函數(shù)級(jí)別上處理了錯(cuò)誤處理。但是,我們可以選擇在全局范圍內(nèi)處理我們的WebFlux錯(cuò)誤。 要做到這
10、一點(diǎn),我們只需要采取兩個(gè)步驟:自定義全局錯(cuò)誤響應(yīng)屬性實(shí)現(xiàn)全局錯(cuò)誤處理程序我們的處理程序拋出的異常將被自動(dòng)轉(zhuǎn)換為HTTP狀態(tài)和JSON錯(cuò)誤正文。 要自定義這些,我們可以簡(jiǎn)單地?cái)U(kuò)展DefaultErrorAttributes類并覆蓋其getErrorAttributes()方法:public class GlobalErrorAttributes extends DefaultErrorAttributesOverridepublic Map getErrorAttributes(ServerRequest request, boolean includeStackTrace) Map map =
11、 super.getErrorAttributes( request, includeStackTrace);map.put(status, HttpStatus.BAD_REQUEST); map.put(message, username is required); return map;在這里,我們希望狀態(tài):BAD_REQUEST和消息:username is required在發(fā)生異常時(shí)作為錯(cuò)誤屬性的一部分返回。接下來(lái),讓我們實(shí)現(xiàn)全局錯(cuò)誤處理程序。 為此,Spring提供了一個(gè)方便的AbstractErrorWebExceptionHandler類,供我們?cè)谔幚砣皱e(cuò)誤時(shí)進(jìn)行擴(kuò)展和實(shí)現(xiàn)
12、:Component Order(-2)public class GlobalErrorWebExceptionHandler extends AbstractErrorWebExceptionHandler / constructorsOverrideprotected RouterFunction getRoutingFunction( ErrorAttributes errorAttributes) return RouterFunctions.route( RequestPredicates.all(), this:renderErrorResponse);private Mono r
13、enderErrorResponse( ServerRequest request) Map errorPropertiesMap = getErrorAttributes(request, false);return ServerResponse.status(HttpStatus.BAD_REQUEST).contentType(MediaType.APPLICATION_JSON_UTF8).body(BodyInserters.fromObject(errorPropertiesMap);在這個(gè)例子中,我們將全局錯(cuò)誤處理程序的順序設(shè)置為-2。 這是為了給它一個(gè)比在Order(-1)注冊(cè)的DefaultErrorWebExceptionHandler更高的優(yōu)先級(jí)。errorAttributes對(duì)象將是我們?cè)赪eb異常處理程序的構(gòu)造函數(shù)中傳遞的副本的精確副本。 理想情況下, 這應(yīng)該是我們自定義的Error Attributes類。然后,我們清楚地說(shuō)明我們想要將所有錯(cuò)誤處理請(qǐng)求路由到renderErrorResponse()方法。最后,我們獲取錯(cuò)誤屬性并將它們插入服務(wù)器響應(yīng)主體中。然后,它會(huì)生成一個(gè)JSON響應(yīng),其中包含錯(cuò)誤,HTTP狀態(tài)和計(jì)算機(jī)客戶端的異常消息的詳細(xì)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國(guó)干酵母行業(yè)發(fā)展趨勢(shì)分析與未來(lái)投資戰(zhàn)略咨詢研究報(bào)告
- 2025年美容師(初級(jí))理論知識(shí)考核試卷:美容院顧客滿意度調(diào)查與分析
- 2025年希臘語(yǔ)等級(jí)考試真題試卷及答案解析
- 工程類員工管理制度
- 科學(xué)健康體重管理制度
- 網(wǎng)絡(luò)貨運(yùn)園區(qū)管理制度
- kyt活動(dòng)管理制度
- 工程管理科管理制度
- 監(jiān)理規(guī)劃人員管理制度
- 用血醫(yī)療文書管理制度
- 三生事業(yè)六大價(jià)值
- 鋯石基本特征及地質(zhì)應(yīng)用
- 絲網(wǎng)除沫器小計(jì)算
- 制缽機(jī)的設(shè)計(jì)(機(jī)械CAD圖紙)
- 學(xué)校財(cái)務(wù)管理制度
- 三年級(jí)下冊(cè)美術(shù)課件-第15課色彩拼貼畫|湘美版(共11張PPT)
- 水稻病蟲統(tǒng)防統(tǒng)治工作總結(jié)
- 水在不同溫度下的折射率、粘度和介電常數(shù)
- howdoyoucometoschoolPPT課件
- 四柱特高弟子班絕密資料——席學(xué)易
- 廣安市教育局文件材料歸檔范圍及保管期限表
評(píng)論
0/150
提交評(píng)論