package Ġcom . byte train . prod inv . web . rest . errors Ċ Ċ import Ġio . github . j hip ster . web . util . Header Util Ċ import Ġjavax . servlet . http . HttpServletRequest Ċ import Ġorg . springframework . beans . factory . annotation . Value Ċ import Ġorg . springframework . dao . Concurrency FailureException Ċ import Ġorg . springframework . http . Response Entity Ċ import Ġorg . springframework . web . bind . Method Argument Not Valid Exception Ċ import Ġorg . springframework . web . bind . annotation . Controller Ad vice Ċ import Ġorg . springframework . web . bind . annotation . ExceptionHandler Ċ import Ġorg . springframework . web . context . request . Native WebRequest Ċ import Ġorg . z al ando . problem . Default Problem Ċ import Ġorg . z al ando . problem . Problem Ċ import Ġorg . z al ando . problem . Status Ċ import Ġorg . z al ando . problem . spring . web . ad vice . Problem Handling Ċ import Ġorg . z al ando . problem . spring . web . ad vice . security . Security Ad vice Trait Ċ import Ġorg . z al ando . problem . vi olations . Constraint Violation Problem Ċ Ċ private Ġconst Ġval ĠFIELD _ ERRORS _ KEY Ġ= Ġ" field Errors " Ċ private Ġconst Ġval ĠMESSAGE _ KEY Ġ= Ġ" message " Ċ private Ġconst Ġval ĠPATH _ KEY Ġ= Ġ" path " Ċ private Ġconst Ġval ĠVI OL ATIONS _ KEY Ġ= Ġ" vi olations " Ċ Ċ /** Ċ Ġ* ĠController Ġadvice Ġto Ġtranslate Ġthe Ġserver Ġside Ġexceptions Ġto Ġclient - friendly Ġjson Ġstructures . Ċ Ġ* ĠThe Ġerror Ġresponse Ġfollows ĠRFC 7 8 0 7 Ġ- ĠProblem ĠDetails Ġfor ĠHTTP ĠAPIs Ġ( https :// tools . ietf . org / html / rfc 7 8 0 7 ). Ċ Ġ*/ Ċ @ Controller Ad vice Ċ class ĠException Translator Ġ: ĠProblem Handling , ĠSecurity Ad vice Trait Ġ{ ĊĊĠĠĠ Ġ@ Value ("\ ${ j hip ster . client App . name }") ĊĠĠĠ Ġprivate Ġval Ġapplication Name : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPost - process Ġthe ĠProblem Ġpayload Ġto Ġadd Ġthe Ġmessage Ġkey Ġfor Ġthe Ġfront - end Ġif Ġneeded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġprocess ( entity : ĠResponseEntity < Problem > ?, Ġrequest : ĠNative WebRequest ?): ĠResponseEntity < Problem >? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( entity Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġproblem Ġ= Ġentity . body ĊĠĠĠĠĠĠĠ Ġif Ġ(!( problem Ġis ĠConstraint Violation Problem Ġ|| Ġproblem Ġis ĠDefault Problem )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġentity ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠProblem . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Type ( if Ġ( Problem . DEFAULT _ TYPE Ġ== Ġproblem . type ) ĠDEFAULT _ TYPE Ġelse Ġproblem . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Status ( problem . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Title ( problem . title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with ( PATH _ KEY , Ġrequest !!. get Native Request ( HttpServletRequest :: class . java ) !!. request URI ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( problem Ġis ĠConstraint Violation Problem ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with ( VI OL ATIONS _ KEY , Ġproblem . vi olations ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with ( MESSAGE _ KEY , ĠERR _ VALIDATION ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Cause (( problem Ġas ĠDefault Problem ). cause ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Detail ( problem . detail ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Instance ( problem . instance ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproblem . parameters . forEach Ġ{ Ġ( key , Ġvalue ) Ġ-> Ġbuilder . with ( key , Ġvalue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! problem . parameters . containsKey ( MESSAGE _ KEY ) Ġ&& Ġproblem . status Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . with ( MESSAGE _ KEY , Ġ" error . http ." Ġ+ Ġproblem . status !!. statusCode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠResponseEntity ( builder . build (), Ġentity . headers , Ġentity . statusCode ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Method Argument Not Valid ( ĊĠĠĠĠĠĠĠ Ġex : ĠMethod Argument Not Valid Exception , ĊĠĠĠĠĠĠĠ Ġrequest : ĠNative WebRequest ĊĠĠĠ Ġ): ĠResponseEntity < Problem >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġex . binding Result ĊĠĠĠĠĠĠĠ Ġval Ġfield Errors Ġ= Ġresult . field Errors . map Ġ{ ĠField Error VM ( it . objectName . replace First ( Regex (" DTO $ "), Ġ""), Ġit . field , Ġit . code ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġproblem Ġ= ĠProblem . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Type ( CONSTRAINT _ VI OL ATION _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Title (" Method Ġargument Ġnot Ġvalid ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Status ( default Constraint Violation Status ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with ( MESSAGE _ KEY , ĠERR _ VALIDATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with ( FIELD _ ERRORS _ KEY , Ġfield Errors ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate ( ex , Ġproblem , Ġrequest ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ ExceptionHandler ĊĠĠĠ Ġfun Ġhandle BadRequest Alert Exception ( ĊĠĠĠĠĠĠĠ Ġex : ĠBadRequest Alert Exception , ĊĠĠĠĠĠĠĠ Ġrequest : ĠNative WebRequest ĊĠĠĠ Ġ): ĠResponseEntity < Problem >? Ġ= ĊĠĠĠĠĠĠĠ Ġcreate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex , Ġrequest , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHeader Util . create Failure Alert ( application Name , Ġfalse , Ġex . entityName , Ġex . error Key , Ġex . message ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ ExceptionHandler ĊĠĠĠ Ġfun Ġhandle Concurrency Failure ( ex : ĠCon currency FailureException , Ġrequest : ĠNative WebRequest ): ĠResponseEntity < Problem >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproblem Ġ= ĠProblem . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Status ( Status . CONF LI CT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with ( MESSAGE _ KEY , ĠERR _ CON CUR RE NCY _ FAILURE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate ( ex , Ġproblem , Ġrequest ) ĊĠĠĠ Ġ} Ċ } Ċ