Spring?Boot的幾種統(tǒng)一處理方式梳理小結(jié)
正文
為了程序返回?cái)?shù)據(jù)友好,返回給前端的數(shù)據(jù)信息是可讀的,往往會(huì)考慮將異常進(jìn)行封裝或者組織為結(jié)構(gòu)化返回。
基于 Spring Boot 體系,原本已經(jīng)提供了一些方式實(shí)現(xiàn),我們今天主要聊的也是基于 Spring Boot 去解決上述問題。
@ExceptionHandler
@ExceptionHandler 可以作為統(tǒng)一攔截異常方式,對(duì)于指定的異常按照你想的方式自由組裝返回的數(shù)據(jù)信息和結(jié)構(gòu)。自由度很高,這里需要注意的一點(diǎn),往往大家會(huì)在這里就直接通過response對(duì)象返回響應(yīng)結(jié)果,從而導(dǎo)致ResponseBodyAdvice、HandlerInterceptor之類的后續(xù)處理不再觸發(fā)。 所以在使用該方式時(shí),盡可能不直接使用response.write方式返回,而是使用統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)作為處理返回值。
// 推薦 @ResponseStatus(value = HttpStatus.OK) @ExceptionHandler(value = ConstraintViolationException.class) @ResponseBody public Resp<Void> onBadMethodArgumentTypeMismatchException(ConstraintViolationException e) { return Resp.badRequest(e.getConstraintViolations().stream().findFirst().get().getMessage()); } // 不推薦 @ExceptionHandler(Exception.class) public void exception(Exception e, HttpServletResponse response) throws IOException { response.setContentType("application/json;charset=UTF-8"); log.error("系統(tǒng)異常:", e); response.getWriter().write($.json.toJsonString(Resp.customize(RpcResult.SERVER_ERROR, "服務(wù)器異常,請(qǐng)稍后再試")); }
ErrorController
Spring Boot 在發(fā)生異常的時(shí)候,如果沒有異常捕捉器存在,會(huì)默認(rèn)調(diào)用/error接口(可以通過server.error.path修改),類似寫接口一樣,對(duì)異常進(jìn)行捕捉處理。
該方式優(yōu)先級(jí)上會(huì)弱一點(diǎn),但也是一種好方式,還可以自己實(shí)現(xiàn)通過配置方式處理異常,可以參考:Dew。
課外拓展
執(zhí)行優(yōu)先級(jí)說明
1、HandlerInterceptor.preHandle() 2、 業(yè)務(wù)方法 3、@ExceptionHandler 4、ResponseBodyAdvice.supports() 5、ResponseBodyAdvice.beforeBodyWrite() 6、HandlerInterceptor.postHandle() 7、HandlerInterceptor.afterCompletion()
以上就是Spring Boot的幾種統(tǒng)一處理方式梳理小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Spring Boot統(tǒng)一處理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- SpringBoot統(tǒng)一接口返回及全局異常處理高級(jí)用法
- SpringBoot返回結(jié)果統(tǒng)一處理實(shí)例詳解
- SpringBoot實(shí)現(xiàn)接口統(tǒng)一前綴
- Springboot中@Async異步,實(shí)現(xiàn)異步結(jié)果合并統(tǒng)一返回方式
- SpringBoot統(tǒng)一返回處理出現(xiàn)cannot?be?cast?to?java.lang.String異常解決
- SpringBoot使用AOP實(shí)現(xiàn)統(tǒng)一角色權(quán)限校驗(yàn)
- Spring?Boot項(xiàng)目完美大一統(tǒng)(結(jié)果異常日志統(tǒng)一)
相關(guān)文章
Java使用ProcessBuilder?API優(yōu)化流程
Java?的?Process?API?為開發(fā)者提供了執(zhí)行操作系統(tǒng)命令的強(qiáng)大功能,這篇文章將詳細(xì)介紹如何使用?ProcessBuilder?API?來方便的操作系統(tǒng)命令,需要的可以收藏一下2023-06-06Spring 整合 MyBatis的實(shí)現(xiàn)步驟
SpringMVC 本來就是 Spring 框架的一部分,這兩者無須再做整合,所以 SSM 整合的關(guān)鍵就是Spring對(duì)MyBatis的整合,三大框架整合完成后,將以 Spring 為核心,調(diào)用有關(guān)資源,高效運(yùn)作,這篇文章主要介紹了 Spring 整合 MyBatis的實(shí)現(xiàn)步驟,需要的朋友可以參考下2023-02-02Idea 同一窗口導(dǎo)入多個(gè)項(xiàng)目的實(shí)現(xiàn)步驟
本文主要介紹了Idea 同一窗口導(dǎo)入多個(gè)項(xiàng)目的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Spring-Cloud Eureka注冊(cè)中心實(shí)現(xiàn)高可用搭建
這篇文章主要介紹了Spring-Cloud Eureka注冊(cè)中心實(shí)現(xiàn)高可用搭建,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-045分鐘快速學(xué)會(huì)spring boot整合JdbcTemplate的方法
這篇文章主要給大家介紹了如何通過5分鐘快速學(xué)會(huì)spring boot整合JdbcTemplate的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot整合JdbcTemplate具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Java攔截過濾器模式 (Intercepting Filter )實(shí)現(xiàn)方法
攔截過濾器模式(Intercepting Filter Pattern)用于對(duì)應(yīng)用程序的請(qǐng)求或響應(yīng)做一些預(yù)處理/后處理,本文通過實(shí)例代碼介紹Java攔截過濾器模式 (Intercepting Filter )的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧2024-03-03spring設(shè)置定時(shí)任務(wù)方式(@Scheduled)
這篇文章主要介紹了spring設(shè)置定時(shí)任務(wù)方式(@Scheduled),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04SpringBoot使用自動(dòng)配置xxxAutoConfiguration
這篇文章介紹了SpringBoot自動(dòng)配置xxxAutoConfiguration的使用方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12