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

      
      

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

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

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

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

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

                適用場(chǎng)景

                使用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修飾的異常處理方法就會(huì)執(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對(duì)象來指定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對(duì)象數(shù)組。

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

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

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

                (2)異常處理方法的返回值限定,最終會(huì)寫入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),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
                用戶投稿
                上一篇 2022年6月22日 12:08
                下一篇 2022年6月22日 12:08

                相關(guān)推薦

                聯(lián)系我們

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

                  • <th id="sdywa"></th>