免费爱碰视频在线观看,九九精品国产屋,欧美亚洲尤物久久精品,1024在线观看视频亚洲

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

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

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

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

      適用場(chǎng)景

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

      解決辦法

      @ControllerAdvice注解 + @ExceptionHandler注解

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

      示例:

      @ControllerAdvicepublic class WebServerExceptionHandler { Logger log = LoggerFactory.getLogger(this.getClass()); public WebServerExceptionHandler() { } // 指定捕獲的異常類(lèi)型,這里是自定義的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())); } // 指定捕獲的異常類(lèi)型,這里是自定義的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類(lèi)型的元素上(也即class或interface),運(yùn)行時(shí)生效。

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

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

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

      性能考慮:不要指定過(guò)多的參數(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ù)很好理解,就是需要處理的異常類(lèi)的Class對(duì)象數(shù)組。

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

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

      • 異常類(lèi)對(duì)象
      • HttpServletRequest、HttpServletResponse
      • HttpSession
      • InputStream/Reader、OutputStream/Writer

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

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

      總結(jié)

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

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

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

      相關(guān)推薦

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

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

        2022年11月27日
      • 存儲(chǔ)過(guò)程語(yǔ)法(sql server存儲(chǔ)過(guò)程語(yǔ)法)

        今天小編給各位分享存儲(chǔ)過(guò)程語(yǔ)法的知識(shí),其中也會(huì)對(duì)sql server存儲(chǔ)過(guò)程語(yǔ)法進(jìn)行解釋?zhuān)绻芘銮山鉀Q你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧! oracle存儲(chǔ)過(guò)程基本語(yǔ)法…

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

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

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

        寶可夢(mèng)朱紫中的奇魯莉安要怎么進(jìn)化呢?很多玩家都不知道,下面就給大家?guī)?lái)寶可夢(mèng)朱紫奇魯莉安進(jìn)化方法分享,感興趣的小伙伴一起來(lái)看看吧,希望能幫助到大家。 奇魯莉安進(jìn)化方法分享 奇魯莉安…

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

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

        2022年11月24日
      • 《寶可夢(mèng)朱紫》暴飛龍?jiān)趺醋??暴飛龍獲得方法

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

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

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

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

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

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

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

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

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

        2022年11月23日

      聯(lián)系我們

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