Spring 全局异常捕获
引言
前后端分離開發(fā),后臺(tái)有時(shí)候會(huì)出現(xiàn)不可預(yù)知的異常(運(yùn)行時(shí)異常),在實(shí)際生產(chǎn)中通常需要統(tǒng)一返回符合一定響應(yīng)結(jié)構(gòu)的異常信息給前端,這一方面可以避免用戶看到后臺(tái)的報(bào)錯(cuò)信息,一方面也是保護(hù)后端程序免受惡意用戶的試探。
簡(jiǎn)單總結(jié)一個(gè)Spring框架下的全局異常捕獲的實(shí)現(xiàn)方式——@RestControllerAdvice。
一、代碼演示
import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;/*** 統(tǒng)一異常捕獲類*/ @Slf4j @RestControllerAdvice public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {@ExceptionHandler(RuntimeException.class)public CommonResp runtimeExceptionProcess(Exception e) {log.error("統(tǒng)一異常捕獲:{}", e.getMessage());e.printStackTrace();CommonResp resp = new CommonResp("9999", "服務(wù)器異常!");log.info("統(tǒng)一異常響應(yīng):{}", resp);return resp;} }二、@RestControllerAdvice
Advice在AOP編程中代表了切面的執(zhí)行邏輯,相當(dāng)于 OOP 中的方法。
@RestControllerAdvice 是 Spring 3.2引入的一個(gè)協(xié)助 Controller 層織入切面邏輯的AOP注解,標(biāo)記類上,類似的注解還有@ControllerAdvice。二者的區(qū)別是前者只用于基于REST API風(fēng)格的 JSON響應(yīng)結(jié)果的controller,簡(jiǎn)單的說(shuō),@ControllerAdvice + @ResponseBody = @RestControllerAdvice 。
@ControllerAdvice public class MyControllerAdvice {@ResponseBody@ExceptionHandler(value = Exception.class)public Map errorHandler(Exception ex) {// 異常處理邏輯return map;} }三、ResponseEntityExceptionHandler
ResponseEntityExceptionHandler 包裝了各種Spring MVC在處理請(qǐng)求時(shí)可能拋出各類異常的處理,通過(guò)對(duì)該類的繼承,我們可以重寫對(duì)應(yīng)的處理邏輯。
比如,我們可以通過(guò)繼承該類,在我們的@RestControllerAdvice 類中重寫?handleBindException(..) 方法,來(lái)處理數(shù)據(jù)綁定的異常信息。
當(dāng)然,第一節(jié)中的代碼案例其實(shí)并不需要繼承??ResponseEntityExceptionHandler ,但也可以作為一種附加參考,方便以后對(duì)特定異常進(jìn)行擴(kuò)展,當(dāng)然也可以自定義異常來(lái)處理。
?
總結(jié)
以上是生活随笔為你收集整理的Spring 全局异常捕获的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM——CPU缓存架构与Java 内存
- 下一篇: Spring Cloud —— 消息队列