package Ġorg . ts des . advanced . rest . exception Ċ Ċ import Ġcom . google . common . base . Throw ables Ċ import Ġorg . springframework . http . HttpHeaders Ċ import Ġorg . springframework . http . HttpStatus Ċ import Ġorg . springframework . http . Response Entity Ċ import Ġorg . springframework . web . bind . annotation . Controller Ad vice Ċ import Ġorg . springframework . web . bind . annotation . ExceptionHandler Ċ import Ġorg . springframework . web . context . request . WebRequest Ċ import Ġorg . springframework . web . servlet . mvc . method . annotation . Response Entity ExceptionHandler Ċ import Ġorg . ts des . advanced . rest . dto . Wrapped Response Ċ import Ġjavax . validation . Constraint Violation Exception ĊĊ Ċ @ Controller Ad vice Ċ class ĠRest Response Entity ExceptionHandler Ġ: ĠResponseEntity ExceptionHandler () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠFor Ġsecurity Ġreasons , Ġwe Ġshould Ġnot Ġleak Ġinternal Ġdetails , Ġlike ĊĠĠĠĠĠĠĠĠ Ġ* Ġclass Ġnames , Ġor Ġeven Ġthe Ġfact Ġwe Ġare Ġusing ĠSpring ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠINTERNAL _ SERVER _ ERROR _ MESSAGE Ġ= Ġ" Internal Ġserver Ġerror " ĊĊĠĠĠĠĠĠĠ Ġfun Ġhandle Possible Constraint Violation ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcause Ġ= ĠThrow ables . getRoot Cause ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cause Ġis ĠConstraint Violation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġcause ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠ ĠNote : Ġ 4 0 4 Ġneeds Ġto Ġbe Ġhandled Ġspec ially . ĠTo Ġdo Ġthis , Ġneed Ġto ĊĠĠĠĠĠĠĠ Ġadd Ġsome Ġconfigurations Ġunder Ġapplication . properties ĊĊĠĠĠĠĠĠĠ Ġhttps :// github . com / spring - projects / spring - boot / issues / 3 9 8 0 ĊĊĠĠĠĠĠĠĠ ĠPoint Ġis , Ġwe Ġneed Ġto Ġexplicitly Ġtell ĠSpring Ġto Ġthrow Ġan Ġexception Ġwhen Ġ 4 0 4 ĊĊĠĠĠĠĠĠĠ Ġspring . mvc . throw Exception If No Handler Found = true ĊĊĠĠĠĠĠĠĠ ĠAnd Ġwe Ġneed Ġto Ġmake Ġsure Ġthat Ġ"/ Ġ** " Ġhandler Ġfor Ġstatic Ġfiles Ġis Ġdisabled , ĊĠĠĠĠĠĠĠ Ġotherwise Ġthe ĠMVC Ġhandler Ġthrowing Ġexceptions Ġwill Ġnever Ġbe Ġcalled ĊĊĠĠĠĠĠĠĠ Ġspring . resources . add - mappings = false ĊĠĠĠĠ Ġ*/ ĊĊĊĠĠĠ Ġ@ ExceptionHandler ( value Ġ= Ġ[ User Input ValidationException :: class ]) ĊĠĠĠ Ġprotected Ġfun Ġhandle Explicit ly Thrown Exceptions ( ex : ĠUser Input ValidationException , Ġrequest : ĠWeb Request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠResponseEntity < Any > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġhandle Exception Internal ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex , Ġnull , ĠHttp Headers (), ĠHttpStatus . valueOf ( ex . http Code ), Ġrequest ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĊĠĠĠĠĠĠ ĠThis Ġis Ġone Ġcase Ġin Ġwhich ĠJ EE Ġis Ġactually Ġbetter Ġthan ĠSpring . ĊĠĠĠĠĠĠ ĠYou Ġmight Ġwant Ġto Ġhave Ġconstraints Ġon Ġuser Ġinputs Ġdirectly ĊĠĠĠĠĠĠ Ġas Ġannotations Ġin Ġmethod Ġparameters , Ġlike Ġit Ġis Ġdone Ġfor ĊĠĠĠĠĠĠ Ġexample Ġon ĠE JB s . ĊĠĠĠĠĠĠ ĠUnfortunately , ĠSpring Ġdoes Ġnot Ġdo Ġsuch Ġvalidation Ġby Ġdefault . ĊĠĠĠĠĠĠ ĠSee Ġpoor Ġexc use / mot ivation Ġat : ĊĊĠĠĠĠĠĠ Ġhttps :// github . com / spring - projects / spring - boot / issues / 6 2 2 8 ĊĠĠĠĠĠĠ Ġhttps :// github . com / spring - projects / spring - boot / issues / 6 5 7 4 ĊĊĠĠĠĠĠĠ ĠThis Ġmeans Ġwe Ġneed Ġto Ġmanually Ġregister Ġan Ġexception Ġhandler . ĊĠĠĠĠĠĠ ĠEvery Ġtime Ġa ĠConstraint Violation Exception Ġis Ġthrown , Ġinstead ĊĠĠĠĠĠĠ Ġof Ġending Ġup Ġin Ġa Ġ 5 0 0 Ġerror , Ġwe Ġcatch Ġit Ġare Ġreturn Ġ 4 0 0 . ĊĊĠĠĠĠĠĠ ĠImport ant : Ġwe Ġalso Ġneed Ġto Ġadd Ġ@ Validated Ġon Ġthis Ġclass . ĊĠĠĠ Ġ*/ ĊĊĠĠĠ Ġ@ ExceptionHandler ( value Ġ= Ġ[ Constraint Violation Exception :: class ]) ĊĠĠĠ Ġprotected Ġfun Ġhandle Framework Exceptions ForUser Inputs ( ex : ĠException , Ġrequest : ĠWeb Request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠResponseEntity < Any > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ex Ġis ĠConstraint Violation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessages Ġ= ĠStringBuilder () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( violation Ġin Ġex . constraint Vi olations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessages . append ( violation . message Ġ+ Ġ"\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġex . constraint Vi olations . map Ġ{ Ġit . property Path . toString () Ġ+ Ġ" Ġ" Ġ+ Ġit . message Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ("; Ġ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhandle Exception Internal ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRuntimeException ( msg ), Ġnull , ĠHttp Headers (), ĠHttpStatus . valueOf ( 4 0 0 ), Ġrequest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġhandle Exception Internal ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex , Ġnull , ĠHttp Headers (), ĠHttpStatus . valueOf ( 4 0 0 ), Ġrequest ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ ExceptionHandler ( Exception :: class ) ĊĠĠĠ Ġfun Ġhandle Bugs For Unexpected Exceptions ( ex : ĠException , Ġrequest : ĠWeb Request ): ĠResponseEntity < Any > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġhandle Exception Internal ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRuntimeException ( INTERNAL _ SERVER _ ERROR _ MESSAGE ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĠHttp Headers (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatus . valueOf ( 5 0 0 ), Ġrequest ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġhandle Exception Internal ( ĊĠĠĠĠĠĠĠ Ġex : ĠException , ĊĠĠĠĠĠĠĠ Ġbody : ĠAny ?, ĊĠĠĠĠĠĠĠ Ġheaders : ĠHttp Headers , ĊĠĠĠĠĠĠĠ Ġstatus : ĠHttpStatus , ĊĠĠĠĠĠĠĠ Ġrequest : ĠWeb Request ĊĠĠĠ Ġ): ĠResponseEntity < Any > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġdto Ġ= ĠWr apped Response < Any >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcode Ġ= Ġstatus . value (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġex . message ĊĠĠĠĠĠĠĠ Ġ). validated () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠResponseEntity ( dto , Ġheaders , Ġstatus ) ĊĠĠĠ Ġ} Ċ }