package Ġxyz . sr cl ab . spring . boot . exception Ċ Ċ import Ġorg . springframework . context . ApplicationContext Ċ import Ġxyz . sr cl ab . common . invoke . Invoker Ċ import Ġxyz . sr cl ab . common . lang . IN HER IT ANCE _ COMP AR ATOR Ċ import Ġjava . lang . reflect . Method Ċ import Ġjava . util .* Ċ import Ġjavax . annotation . Post Construct Ċ import Ġjavax . annotation . Resource Ċ Ċ /** Ċ Ġ* ĠGlobal Ġexception Ġhandling Ġservice . Ċ Ġ* Ċ Ġ* ĠIt Ġgets Ġall Ġbe ans Ġwith Ġannotation Ġ[ Exception Handling Component ] Ġand Ġresolve Ġtheir Ġ[ Exception Handling Method ] Ġmethod Ġto Ċ Ġ* Ġhandle Ġexceptions . Ċ Ġ* Ċ Ġ* Ġ@ see ĠEnable Exception Handling Service Ċ Ġ* Ġ@ see ĠException Handling Component Ċ Ġ*/ Ċ open Ġclass ĠException Handling Service Ġ{ ĊĊĠĠĠ Ġ@ Resource ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġapplication Context : ĠApplication Context ĊĊĠĠĠ Ġprivate Ġval Ġhandlers : ĠTreeMap < Class <* >, ĠHandling Method > Ġ= ĠTreeMap ( COMP AR ATOR ) ĊĊĠĠĠ Ġ@ Post Construct ĊĠĠĠ Ġprivate Ġfun Ġinit () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġresolve ExceptionHandler ( handler : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethods Ġ= Ġhandler . java Class . methods ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( method Ġin Ġmethods ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception Handler Method Ġ= Ġmethod . getAnnotation ( Exception Handling Method :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exception Handler Method Ġ=== Ġnull Ġ|| Ġmethod . is Bridge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( method . parameter Count Ġ!= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Exception Ġhandler Ġmethod Ġmust Ġhave Ġonly Ġone Ġparameter .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception Class Ġ= Ġmethod . parameter Types [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Throwable :: class . java . isAssignableFrom ( exception Class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Exception Ġhandler Ġmethod 's ' parameter Ġmust Ġbe Ġtype Ġof ĠThrowable .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexists Method Ġ= Ġhandlers [ exception Class ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exists Method Ġ!== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Each Ġtype Ġof Ġexception Ġmust Ġhave Ġone Ġhandling Ġmethod Ġbut Ġnow Ġthere Ġare Ġtwo : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ exists Method . method }, Ġ$ method " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandlers [ exception Class ] Ġ= ĠHandling Method ( handler , Ġmethod , ĠInv oker . for Method ( method )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġapplication Context . get Beans With Annotation ( Exception Handling Component :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve ExceptionHandler ( entry . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġ< T > Ġhandle ( e : ĠThrowable ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexception Class Ġ= Ġe . java Class ĊĠĠĠĠĠĠĠ Ġval Ġhandling Method Ġ= Ġhandlers [ exception Class ] ĊĠĠĠĠĠĠĠ Ġif Ġ( handling Method Ġ!== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhandling Method . inv oker . invoke ( handling Method . component , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġhandling Methods Ġ= Ġhandlers ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sub Map ( Throwable :: class . java , Ġtrue , Ġexception Class , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. desc ending Map () ĊĠĠĠĠĠĠĠ Ġfor Ġ( handling Method Entry Ġin Ġhandling Methods ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠsuperClass Ġ= Ġhandling Method Entry . key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( super Class . isAssignableFrom ( exception Class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġhandling Method Entry . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmethod . inv oker . invoke ( method . component , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Exception Ġhandling Ġmethod Ġnot Ġfound : Ġ$ e ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠHandling Method ( ĊĠĠĠĠĠĠĠ Ġval Ġcomponent : ĠAny , ĊĠĠĠĠĠĠĠ Ġval Ġmethod : ĠMethod , ĊĠĠĠĠĠĠĠ Ġval Ġinvok er : ĠInv oker ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠCOMP AR ATOR : ĠComparator < Class <* >> Ġ= ĠComparator Ġ{ Ġc 1 , Ġc 2 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- IN HER IT ANCE _ COMP AR ATOR . compare ( c 1 , Ġc 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ