ControllerAdvice全域性異常處理

2021-10-24 06:28:52 字數 2304 閱讀 6072

@controlleradvice是spring提供的注釋,使您可以編寫可應用於各種控制器的全域性**-從所有控制器到選定的包,甚至是特定的注釋。在這個簡短的教程中,我們將專注於處理異常使用@controlleradvice和@exceptionhandler(@initbinder和@modalattribute也可以使用@controlleradvice)。

使用如下依賴進行測試:

org.springframework.boot

spring-boot-starter-hateoas

對於hateoas的相關介紹,可以看看這篇文章

預設情況下,@controlleradvice將應用於使用@controller注釋的所有類(擴充套件到使用的類@restcontroller)。如果您想更具體一點,可以使用一些屬性來實現這一點。

要按包減少適用的類,您只需要將包的名稱新增到注釋中。選擇乙個程式包後,將為該程式包內的子類以及子程式包啟用該程式包。也可以按照相同的過程選擇多個包,但是使用陣列而不是單個字串(其中的所有屬性都@controlleradvice可以是單個或多個)。

@controlleradvice("my.chosen.package")

@controlleradvice(value = "my.chosen.package")

@controlleradvice(basepackages = "my.chosen.package")

可以通過basepackageclasses屬性來指定包,該屬性將使@controlleradvice類(或介面)所在的包中的所有控制器都可用。

如果要指定特定的類,可以通過@controlleradvice(assignabletypes = mycontroller.class)來指定。

如果要應用於某些帶注釋的控制器,可以使用  @controlleradvice(annotations = restcontroller.class) ,此處僅對restcontroller起作用,而不會對帶controller的起作用,儘管restcontrolle註解相當於@responsebody + @controller。

@exceptionhandler顧名思義,您可以定義乙個處理異常的方法。如果您不使用@controlleradvice,則處理這些異常的**將在控制器本身中,這可能會給類增加很多重複和混亂,並導致其不那麼「乾淨」。您可以將這些@exceptionhandler方法移到控制器擴充套件以分離**的基類中。此方法並不完美,並且存在乙個問題,即您需要此全域性異常處理的每個控制器現在都需要擴充套件基本控制器。因此,當您建立乙個新的控制器而忘記擴充套件此基類時,您現在不再處理某些異常,以後可能會陷入困境。使用@controlleradvice@exceptionhandler通過提供全域性(更具體的)錯誤處理來防止這種情況的發生,因此您無需記住自己實現它們或每次擴充套件另乙個類。

示例:

@exceptionhandler為同一異常定義了多個物件  ,需要進行監視。當在同一類中定義時,spring足以引發異常並在啟動時失敗。但是,當它們出現在不同的類中時,例如說兩個@controlleradvice類,都帶有的處理程式personnotfoundexception,應用程式將啟動-但將使用找到的第乙個處理程式。如果您不知道,這可能會導致意外的行為。

切面實現Dubbo請求日誌以及全域性異常處理

專案中經常會看到在所有的rpc介面實現中記錄請求引數,以及try catch,每個方法都來一次,看著就不舒服,類似下面這段 public cloudserverresponse updateexpressinfo json.tojsonstring cloudserverresponse cloud...

SpringMVC 全域性異常統一處理

使用 exceptionhandler 註解 實現 handlerexceptionresolver 介面 使用 controlleradvice 註解 當以上三個方式,一起出現時,只執行執行範圍最小的方式,後面的方式不再執行處理 執行範圍 exceptionhandler controllerad...

全域性異常處理 springBoot 全域性異常處理

先讚後看,月入百萬 springboot開發的web專案中,強調分層的概念,乙個完整的專案一般會劃分出controller層和service層。因此,為了 的可維護性,controller層 應該盡量簡潔,驗證一下引數,直接丟給service層處理即可 異常處理的方式無外乎兩種 在springboo...