亚洲精品中文免费|亚洲日韩中文字幕制服|久久精品亚洲免费|一本之道久久免费

      
      

            <dl id="hur0q"><div id="hur0q"></div></dl>

                Spring Boot應(yīng)用中的異常處理

                樓主前幾天寫了一篇“Java子線程中的異常處理(通用)”文章,介紹了在多線程環(huán)境下3種通用的異常處理方法。

                但是平時(shí)大家的工作一般是基于開發(fā)框架進(jìn)行的(比如Spring MVC,或Spring Boot),所以會有相應(yīng)特定的異常處理方法,這篇文章要介紹的就是web應(yīng)用中的異常處理。

                想快速解決問題的小伙伴可以只看“解決辦法”,想進(jìn)一步了解細(xì)節(jié)的小伙伴還可以看“深入剖析”部分。

                適用場景

                使用Spring MVC或Spring Boot框架搭建的web應(yīng)用

                解決辦法

                @ControllerAdvice注解 + @ExceptionHandler注解

                實(shí)現(xiàn)一個(gè)異常處理類,在類上應(yīng)用@ControllerAdvice注解,并在異常處理方法上應(yīng)用@ExceptionHandler注解。那么在web應(yīng)用中,當(dāng)Controller的@RequestMapping方法拋出指定的異常類型時(shí),@ExceptionHandler修飾的異常處理方法就會執(zhí)行。

                示例:

                @ControllerAdvicepublic class WebServerExceptionHandler { Logger log = LoggerFactory.getLogger(this.getClass()); public WebServerExceptionHandler() { } // 指定捕獲的異常類型,這里是自定義的SomeException @ExceptionHandler({SomeException.class}) public ResponseEntity handle(HttpServletResponse response, SomeException ex) { WebServerExceptionResponse body = new WebServerExceptionResponse(); body.setStatus(ex.getStatus()); body.setMessage(ex.getMessage()); this.log.info(“handle SomeException, status:{}, message:{}”, new Object[]{body.getStatus(), body.getMessage()}); return new ResponseEntity(body, HttpStatus.valueOf(ex.getStatus())); } // 指定捕獲的異常類型,這里是自定義的OtherException @ExceptionHandler({OtherException.class}) public ResponseEntity handle(HttpServletResponse response, OtherException ex) { WebServerExceptionResponse body = new WebServerExceptionResponse(); body.setStatus(ex.getStatus()); body.setMessage(ex.getMessage()); this.log.info(“handle OtherException, status:{}, message:{}”, new Object[]{body.getStatus(), body.getMessage()}); return new ResponseEntity(body, HttpStatus.valueOf(ex.getStatus())); }}

                深入剖析

                @ControllerAdvice的定義如下:

                @Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface ControllerAdvice { String[] value() default {}; String[] basePackages() default {}; Class[] basePackageClasses() default {}; Class[] assignableTypes() default {}; Class[] annotations() default {};}

                可以看出它應(yīng)用在TYPE類型的元素上(也即class或interface),運(yùn)行時(shí)生效。

                作用是Controller類的幫助注解,一般搭配@ExceptionHandler注解,用來處理Controller的@RequestMapping修飾的方法拋出的異常。

                樓主根據(jù)源碼注釋整理了5個(gè)參數(shù)的含義,它們都是用來限定需要處理的Controller的:

                • value():等同于basePackages,表示需要被處理的Controller包名數(shù)組,例如 @ControllerAdvice(“org.my.pkg”)。如果不指定,就代表處理所有的Controller類
                • basePackages():表示需要被處理的Controller包名數(shù)組,例如 @ControllerAdvice(basePackages={“org.my.pkg”,”org.my.other.pkg”})
                • basePackageClasses():通過標(biāo)記類來指定Controller包名數(shù)組
                • assignableTypes():通過類的Class對象來指定Controller包名數(shù)組
                • annotations():被注解修飾的Controller需要被處理

                性能考慮:不要指定過多的參數(shù)和異常處理策略,因?yàn)楫惓z查和處理都是在運(yùn)行時(shí)做的。

                @ExceptionHandler的定義如下:

                @Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface ExceptionHandler { /** * Exceptions handled by the annotated method. If empty, will default to any * exceptions listed in the method argument list. */ Class[] value() default {};}

                可以看出它作用在方法上面,而且參數(shù)很好理解,就是需要處理的異常類的Class對象數(shù)組。

                但是,它對修飾的異常處理方法的參數(shù)和返回值有限定,樓主根據(jù)源碼的注釋整理如下:

                (1)異常處理方法的參數(shù)限定,可以是以下類型,順序任意:

                • 異常類對象
                • HttpServletRequest、HttpServletResponse
                • HttpSession
                • InputStream/Reader、OutputStream/Writer

                (2)異常處理方法的返回值限定,最終會寫入response流:

                • ResponseEntity
                • HttpServletResponse
                • ModelAndView
                • Model
                • Map
                • View

                總結(jié)

                以上就是在Spring web應(yīng)用中的異常處理方法:使用@ControllerAdvice搭配@ExceptionHandler修飾自定義異常處理方法,處理來自Controller類中的@RequestMapping方法拋出的異常。

                使用時(shí)需要根據(jù)實(shí)際情況,合理設(shè)置@ControllerAdvice和@ExceptionHandler的參數(shù)。

                鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權(quán)歸原作者所有,如有侵權(quán)請聯(lián)系管理員(admin#wlmqw.com)刪除。
                用戶投稿
                上一篇 2022年6月22日 12:08
                下一篇 2022年6月22日 12:08

                相關(guān)推薦

                • 分享4條發(fā)微商朋友圈的方法(微商朋友圈應(yīng)該怎么發(fā))

                  對于微商朋友來說,朋友圈的重要性不言而喻了。 那么微商的朋友圈到底該怎么發(fā)呢? 為什么同樣是經(jīng)營一個(gè)朋友圈,有的微商看起來逼格滿滿,實(shí)際效果也不錯(cuò);而有的卻動都不動就被屏蔽甚至拉黑…

                  2022年11月27日
                • 存儲過程語法(sql server存儲過程語法)

                  今天小編給各位分享存儲過程語法的知識,其中也會對sql server存儲過程語法進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關(guān)注本站,現(xiàn)在開始吧! oracle存儲過程基本語法…

                  2022年11月26日
                • 《寶可夢朱紫》夢特性怎么獲得?隱藏特性獲取方法推薦

                  寶可夢朱紫里有很多寶可夢都是擁有夢特性會變強(qiáng)的寶可夢,很多玩家不知道夢特性怎么獲得,下面就給大家?guī)韺毧蓧糁熳想[藏特性獲取方法推薦,感興趣的小伙伴一起來看看吧,希望能幫助到大家。 …

                  2022年11月25日
                • 《寶可夢朱紫》奇魯莉安怎么進(jìn)化?奇魯莉安進(jìn)化方法分享

                  寶可夢朱紫中的奇魯莉安要怎么進(jìn)化呢?很多玩家都不知道,下面就給大家?guī)韺毧蓧糁熳掀骠斃虬策M(jìn)化方法分享,感興趣的小伙伴一起來看看吧,希望能幫助到大家。 奇魯莉安進(jìn)化方法分享 奇魯莉安…

                  2022年11月25日
                • 銳龍97900x參數(shù)規(guī)格跑分評測 銳龍97900x屬于什么檔次

                  銳龍9 7900X是銳龍7000系列處理器中性能頂尖的型號之一,它采用了這一代標(biāo)配的zen4架構(gòu)和5nm制程工藝,那么它具體的參數(shù)跑分如何,在電腦上世紀(jì)發(fā)揮怎么樣呢,下面就來看看銳…

                  2022年11月24日
                • 《寶可夢朱紫》暴飛龍?jiān)趺醋ィ勘╋w龍獲得方法

                  寶可夢朱紫暴飛龍位置在哪?在游戲中,很多玩家還不清楚暴飛龍具體要怎么樣獲得,其實(shí)獲得方法很簡單,暴飛龍直接是沒得抓的,需要玩家從寶貝龍進(jìn)化得到,下面一起來看一下寶可夢朱紫暴飛龍獲得…

                  2022年11月23日
                • 《寶可夢朱紫》布土撥怎么進(jìn)化?布土撥進(jìn)化方法介紹

                  寶可夢朱紫中,不同的寶可夢有不同的進(jìn)化方法,其中布土撥的進(jìn)化方法是比較特殊的。很多玩家不知道寶可夢朱紫布土撥怎么進(jìn)化,下面就帶來寶可夢朱紫布土撥進(jìn)化方法介紹,一起來看看吧,希望能幫…

                  2022年11月23日
                • 《寶可夢朱紫》薄荷怎么獲得?薄荷獲得方法

                  寶可夢朱紫中薄荷有改變寶可夢的屬性或性格等效果,很多玩家想知道寶可夢朱紫薄荷怎么獲得,下面就帶來寶可夢朱紫薄荷獲得方法,感興趣的小伙伴一起來看看吧,希望能幫助到大家。 薄荷獲得方法…

                  2022年11月23日
                • 《寶可夢朱紫》怎么交換精靈?交換精靈方法一覽

                  寶可夢朱紫中玩家可以和好友或者npc進(jìn)行交換寶可夢獲得自己沒有的寶可夢,很多玩家想知道寶可夢朱紫怎么交換精靈,下面就帶來寶可夢朱紫交換精靈方法一覽,感興趣的小伙伴不要錯(cuò)過,希望能幫…

                  2022年11月23日
                • 《寶可夢朱紫》龍爪技能怎么獲得?龍爪技能獲取方法

                  寶可夢朱紫龍爪技能怎么獲得?在游戲中,很多玩家還不清楚龍爪技能應(yīng)該怎么獲取,其實(shí)獲取方法有很多,下面一起來看一下寶可夢朱紫龍爪技能獲取方法,希望可以幫助各位玩家順利的進(jìn)行游戲內(nèi)容?!?/p>

                  2022年11月23日

                聯(lián)系我們

                聯(lián)系郵箱:admin#wlmqw.com
                工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息