From 20e74216039ccb9e8ea034d33a20dccacce608d2 Mon Sep 17 00:00:00 2001 From: rayankonecny Date: Mon, 1 Dec 2025 02:59:30 +0000 Subject: [PATCH] add jakarta bean validation --- .../java/models/exceptions/StandardError.java | 4 +- .../exceptions/ValidationException.java | 26 +++++++++ .../models/requests/CreateUserRequest.java | 17 ++++-- .../StandardError$StandardErrorBuilder.class | Bin 2360 -> 2825 bytes ...andardError$StandardErrorBuilderImpl.class | Bin 0 -> 1250 bytes .../models/exceptions/StandardError.class | Bin 1427 -> 1860 bytes .../ValidationException$FieldError.class | Bin 0 -> 800 bytes ...Exception$ValidationExceptionBuilder.class | Bin 0 -> 2744 bytes ...ption$ValidationExceptionBuilderImpl.class | Bin 0 -> 1777 bytes .../exceptions/ValidationException.class | Bin 0 -> 2157 bytes .../models/requests/CreateUserRequest.class | Bin 3044 -> 5046 bytes .../target/hd-commons-lib-1.0.0.jar | Bin 8861 -> 13674 bytes .../compile/default-compile/createdFiles.lst | 5 ++ .../compile/default-compile/inputFiles.lst | 1 + .../controller/UserController.java | 4 +- .../ControllerExceptionHandler.java | 50 ++++++++++++++---- 16 files changed, 88 insertions(+), 19 deletions(-) create mode 100644 hd-commons-lib/src/main/java/models/exceptions/ValidationException.java create mode 100644 hd-commons-lib/target/classes/main/java/models/exceptions/StandardError$StandardErrorBuilderImpl.class create mode 100644 hd-commons-lib/target/classes/main/java/models/exceptions/ValidationException$FieldError.class create mode 100644 hd-commons-lib/target/classes/main/java/models/exceptions/ValidationException$ValidationExceptionBuilder.class create mode 100644 hd-commons-lib/target/classes/main/java/models/exceptions/ValidationException$ValidationExceptionBuilderImpl.class create mode 100644 hd-commons-lib/target/classes/main/java/models/exceptions/ValidationException.class diff --git a/hd-commons-lib/src/main/java/models/exceptions/StandardError.java b/hd-commons-lib/src/main/java/models/exceptions/StandardError.java index 4ecc561..3065349 100644 --- a/hd-commons-lib/src/main/java/models/exceptions/StandardError.java +++ b/hd-commons-lib/src/main/java/models/exceptions/StandardError.java @@ -3,10 +3,10 @@ package main.java.models.exceptions; import java.time.LocalDateTime; import lombok.Getter; import lombok.Setter; -import lombok.Builder; +import lombok.experimental.SuperBuilder; @Getter -@Builder +@SuperBuilder public class StandardError { private LocalDateTime timestamp; private Integer status; diff --git a/hd-commons-lib/src/main/java/models/exceptions/ValidationException.java b/hd-commons-lib/src/main/java/models/exceptions/ValidationException.java new file mode 100644 index 0000000..7585d67 --- /dev/null +++ b/hd-commons-lib/src/main/java/models/exceptions/ValidationException.java @@ -0,0 +1,26 @@ +package main.java.models.exceptions; + +import java.lang.reflect.Field; +import java.util.List; + +import lombok.experimental.SuperBuilder; +import lombok.Getter; +import lombok.AllArgsConstructor; + +@SuperBuilder +public class ValidationException extends StandardError { + + @Getter + private List errors; + + @Getter + @AllArgsConstructor + private static class FieldError { + private String fieldName; + private String message; + } + + public void addError(final String fieldName, final String message) { + this.errors.add(new FieldError(fieldName, message)); + } +} diff --git a/hd-commons-lib/src/main/java/models/requests/CreateUserRequest.java b/hd-commons-lib/src/main/java/models/requests/CreateUserRequest.java index 91a6981..67eba26 100644 --- a/hd-commons-lib/src/main/java/models/requests/CreateUserRequest.java +++ b/hd-commons-lib/src/main/java/models/requests/CreateUserRequest.java @@ -1,13 +1,22 @@ package main.java.models.requests; import java.util.Set; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; import main.java.models.enums.ProfileEnum; +import io.swagger.v3.oas.annotations.media.Schema; + import lombok.With; @With public record CreateUserRequest( - String name, - String email, - String password, - Set profiles) { + @Schema(description = "Name of the user", example = "John Doe", required = true) @NotEmpty(message = "Name cannot be empty") @Size(min = 3, max = 50, message = "Name must contain between 3 and 50 characters") String name, + + @Schema(description = "Email of the user", example = "rayanvix@gmail.com") @Email(message = "Invalid email format") @NotBlank(message = "Email cannot be blank") @Size(min = 6, max = 50, message = "Email must contain between 6 and 50 characters") String email, + + @Schema(description = "Password of the user", example = "P@ssw0rd!", required = true) @NotEmpty(message = "Password cannot be empty") @Size(min = 6, max = 20, message = "Password must contain between 6 and 20 characters") @NotBlank(message = "Password cannot be blank") String password, + + @Schema(description = "Profiles assigned to the user", example = "[\" ROLE_ADMIN \", \"ROLE_CUSTOMER \" ]", required = true) Set profiles) { } diff --git a/hd-commons-lib/target/classes/main/java/models/exceptions/StandardError$StandardErrorBuilder.class b/hd-commons-lib/target/classes/main/java/models/exceptions/StandardError$StandardErrorBuilder.class index e183b1d660e92f81097aab744963508ce2bd635a..8690c485f1cf6b9c00ac82ed9d2ca6cec2de9e0f 100644 GIT binary patch literal 2825 zcmb_e+fo}x5IqADx?~ezd`J&t}7RW}j3D`0uk>XU!Pm44WYgW6e-4PXk zLw+EikyPbYe#i&pqf$AuyWmx6p{&9WGd+45Tq5 zaPFCTXjW{~=~Z_3p2?09m|3$NOVtFXi=`(yWRc4tZ{Q6W0=2$rIh9~f-|b4lU|^>U|c_16E(=pZemfGivfjNqSxp8CB&X}#ESYx7b zr4uCyUNPPVOG03_X*qId*x!?0+uXA$DFoSlVtSV5BVkJITXgf@S+gpzFlzq!;0R*t zjJDU>jcU7ItyKk{MyHujtY@xE-inshb6Afa4{PNVBswGTT|BWzX?zV%TuihZK(^zb zqM~>Wh>J;P1Hg2#6w*E2I0SA@a{GBkdVhm7tK86Cfq9yE+3cbq1b$v?+ zu~hqR*U#bst7#Nugp0a%@wjKNi8h2>V0~tTi&`T&CcMfJhrf%!9(4t z9to_zJbcSJbPpuo3*AP;=Cx^dlI~O{(3=mv8)mO!-f|`760`n+u^%9HI!qauNT>c%Izwr*qd5#Ml zOB|P9;2MxzFkulcj}@Vo=rT!14y>aV6wF=R3+M(Kq*=mla@rN9v6#fQ*Ep-(rC?Xech%Jisek-6-u1VD&1&s06(2lUM-EDTKMBl{6&;*0g z#0T)9jOXkwvQ1Z0qd#Wnvgdr~I^TT%@#PzUr&vv+1IG+>n&?8eK;MqslX+V@Tlp88 zJF21ux@RoM(sKgGvbl{Oq|jp^ZQ?jgfw`KroP3~DbF0es^XhFy)wSh1e!i@wQnZuH1X`&Z> ziU+=~I$CWhFA&U_7{H)FmtwmDnV4KzdzP~mh@Cbu#9{{7_vMyi8^b2f@>yqH>TLs~ z0=c#WOk)J&oW*kjD*M||V$K{o9XpErYv&}lk;VmFG;qnp1THs~E`*`j_N3iVFWv}D zMjpi~TgbJV$xu^VF_A@1V5lZ{Rnc`SQopqHHmxZ0j;74Jaj;gG|1qvsuc#nJ>Mnua zlI5u9joPO2*5sy5Cz+s8Hl%0qK055w+ZMU`q||ot61%e?@cQ?K%>6t1dOVMZS^E#T zYjNDDKK}u>Ym;xSz;yO6z$l3+?H)GdAgLZPOyrtCy6iT*idwRQl9uDVah=5p<2kX! zit7^}_07Ak_O&PL&y?PFt9}Y(WW8CdX&13g_7~U8ifiZnfJS%~@B}X+Cg3F#z^usi zc4Ib;IXpJ-gs;U@fr%skEoaZ&Rm5{lD&b98k`?WG?*!h*YY+*B{;m)!+RC3Ox$bVG zUTDon?4(I??Ok0Zh`)}>hn(GXvm=P2wC%E`6{X5tbsXgtZRz`puE}6ht_&;+Ty6<9 zDFOq_0^@%cCE57k zbpY{^79F@sU;YjB;2M3+Pyo}oPCG$nSc#PjB+bT+sjHvp^MRJF>Ze1INS%ZOKiO(8 zZX^MnXd8$FWuO7vOakg}8;CQ-Ktstur`iVMR5Q@oWS}!`197bw=oW6%my^9jnd732 ze#OYEseQ`#K2Ff+r*VqLnFEX^S0F6l=&u6a!QBXRnL2?n$4KA!jPo=#L4Ls`@F&o* p2(%OTg5uxDgJ2%PLz+_rK11UX=4qFqMo7`CUZlQSpm0_&{1Yp1Mf?B& diff --git a/hd-commons-lib/target/classes/main/java/models/exceptions/StandardError$StandardErrorBuilderImpl.class b/hd-commons-lib/target/classes/main/java/models/exceptions/StandardError$StandardErrorBuilderImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..e2196385ab5d309572df2ae15d1c0925309db2ad GIT binary patch literal 1250 zcmb_cO;6iE5Pjn~7#s6ZzDj}8f_g|0U?h$~kw_>iQp6=FQjeQtfklpu)(+xl!G%gi z;s@}fs?M5-DpEi}>1D?=p7-YM&dxsl`TYps02>}GXlrMMPBCvM9y z3FJ*nUZpCIlAxZ7s4aB+yVkM(*5_5aDr`$l7~5BoO3Q>?q1bRRPACpd>A`_#giH{s zh1$@#fl^AvhKET^Ihgh_gAattXoSa|tB_zPGCU(36^bM3Gjt{9tMV}urfVvaC*4j{ z>Qm7SIWk*|TOw=-t&HCb+UbQ#2#5ctcD`x4M%aGOW>|COJ^6#1LvZWrJQ8VF^Iq>p z+|T~-_|ovH1C?iOEAt_E^|-5B@Kld~Ge3m!6Pctx;v^;b$5AA8H55rAxqtJ0 z=`XXhG$?EeVwZ2S#RCi2YY4wnVk67v<_mInw?gN~kT-tq$zP=&%I|Zb1uJrfBy;K4GIYa5R4+EA&iK?)S29|ItB`{y~5-E>fY*vi=p5e-4p7L=_sH&3!*`W(6rqddd znBf&z!EHMNGu;y2{SGWw)}-wvpH|Un4c9Oy5SEItK=Mj($+boL>}HCi<;rJINN<-vm%wDv zwB%8{QI__xQLfXI^g4fH*rq!7oFVtrWcSvGubdYUWr3aH5x)0knsh&*FRe>bdn4xF z%H_71KVC9x7GHi}5s8xI{>Vvsx7BLWRg&sSZjpKaCpxx< z!KI#ZW-lZAv?CB>j3;n`R9{F>F#-uj9ClU0zVPsY%AmW{Y}*yNZ+fqeW&X{IO+`sy z?1(fErFxuveA|o^^0YTj58iC*% zM}}*$iF<&D+$kc<9vX=K!0N{ftbL_V^wsF1 z9?|<4Pq-?SPOBJ%bLSXWkiZqlm`AHyI^3fr@D$H{z^Os7<_ms~7e3(mLGZXQ_@yuS w#vpjY7o7J6uMC1GeZWC%d7XKMZQ2NXw91kGn)@X8F}|RkP@KLA{&Oz;0e;xIUjP6A literal 1427 zcma)5Yikoh6g`t<^Xj(gQyb$WYSm=>SRWrN1zQygX%$)uew-vjx+U3^-HrIcAEjU@ zDEI^XQR11&7L%}r1hV(e-E-!i``AB!fBpvW2Cs@pA)Q0UhJ~!a;)VPy-LCXI?uX`u zYDEIs*Pic1djjcN{j7jI3ON*Q%)u6@_oU~$hSTe}RX23imzKJWyuKg0Cz15qGHAaG zf_@-Sh`gQ(BiXwYC^rm8N8CogCA)8Bq)vI-)d?1Cl(5LmL`Q>AU}Xe1vJU-7byQ%0 z%QjZ9DqyKmisdofNfdZ~$G~pcxUFG1<_~2@=^SMncXTXsDWmfo?h5S9T+7BpW%~oK z+g3pl6{H1J?Z(o^#9bFL7K-)G5~-h2_W}DYP-=L-Iv(_zDmazRE+fmPpJy`g^f?Y@ zqH~XZ+-%HT<1X9P991T;U#ri~OzaM?vpXu%BaT;~!aHwT0xk=|?6R5u+BI@w{sMVo z;@w)EfW)m7C=zirnmNni;UkC5@JW9VwA6dg^lM_6J6e*!+%aVyDcx4K%|7&f6&!SB z7%CoDCm8Yg@sLZE;x}dS$!~*RN^h~TTvB7Xg~oF8Xmk8qxDSB`^u7|GrL8(w5YFZh zIcIB#d1rfwC8wMjV$CUAL#%%%CWR`WSu%kFGXr}gE*{}APrSuw(C@28g;rM89}CjP z(@HYN(^@RvvVkYOPb;bNe*Me;LgmvH?tP;#82z77;3=NPXqQ&-o#p&MPD97V%^7j_ z2oQ@CsG*)fo}VV$iDU`Q4 NFX$DGm&Z#K{sAYpBw7Ff diff --git a/hd-commons-lib/target/classes/main/java/models/exceptions/ValidationException$FieldError.class b/hd-commons-lib/target/classes/main/java/models/exceptions/ValidationException$FieldError.class new file mode 100644 index 0000000000000000000000000000000000000000..64ebeb170ba92b81fabfc8c630ddaa09fce73ddb GIT binary patch literal 800 zcmbVK$w~u35Pg-zj2TDc689|!!5GE4s|X^BLW~C`_fFErmRV$a6hBKr5j^+-ew0|< zQ356xrJ-w~s@|*R9BIEH z0@W5qKl*X59V;2MkCG%#2!$(S)I}%>lQml;5K+g!ND~!xb`8|9hl0UzLaDXrNEajU z9E^GxLy<7vOFD1f$W}_o@2Nm&qa|1@a zZDv9ku1lSs#5#4bOz{6ml?QhkMKU=Igw~Rqb$g3LnHMv{=aAvYS70^X63Z-jCz#-W zk}aPlu^g&CgC1?z6#seaoI;6puN#1A%&W}$Fvw@jEX%T3eT7@y zd;wLrUf?{jD}x?~30tPz4gKc8Nwz6Nyl9TkmYTPj3s|&r2`emJ2FqXxt8l*nKpn1- literal 0 HcmV?d00001 diff --git a/hd-commons-lib/target/classes/main/java/models/exceptions/ValidationException$ValidationExceptionBuilder.class b/hd-commons-lib/target/classes/main/java/models/exceptions/ValidationException$ValidationExceptionBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..4928431cc20bf41ff2e8090498fb71c66c883a9d GIT binary patch literal 2744 zcmb_eTW=dh6#mB9WD{e^r6s)prKN6byB7n6Qewvty9sIQrVqA)M5Rg-dq}p~>{`3y zi2f6P21rm)ANT>h@_!KDc(=YJ8&?*2@SHhk&z$evd}jXs_w`=@*07aE3R5<$45l$7 zP&tr}S9~E4W%0moD>p2vpIWM;9p4L!4K2O44BG2K;0M_euG)3nwh9Dh%8uvgiojGZ zzdeUp%-Kk1@D4HpkH#6_mafy5259{aVm3iG08++_P++0nbGNGF@L+N(aQ@VLQH+25#&I{Gjr38~pEZv70e1uB^=MLn)s`*|^>hB%B$6d%OY3Akr zu(8;gA@i{$!Mw@eYk|g5fd5&hJRN5j{e2aW(rC(U$d>klmjXWz&$n1H@@tKOlbPW(wE2n$JKQH@KR^R6q`S(!z-3COJWXTQqIV{XlA9(}kPA!!EqS zyT6b-ZgV-(iftOC$Vp>;@Xc6{zGaCL1#sK4%xk01-?4Zd!TuBPzs3hZvRhH8i^oDW5<0W6MyO9?(`%$r=3e3Bapq3U+`znp6O#6} zLQKag`W$x|atdGI%O1Ul`=ql3D)ILCFvblaI~~j zglEmelIQ|)oz}p?X`HdJ>|zCH3BARUA54yXf*DKyHQ`0GwLsmPx}%k!bFqeXLUpL! zCTx{2(_xK!++@P?p$cSgIvL97r5O60Sv?F#!XJo8>2;Pglea1+JYV$pu=(ZH7d4k~ z|38HNLHP1-KY)hP=oFf%=IUH&?! zA5No@e5~~O*vPr}5A@g|EcIlZJPG53;2s2ljP`sH$C3|DJqPr6SZtpBQcJLKhtMs$ zqccs(ZIOi*p*1%LVQq#plZuCY{S2O-K#e1hO%TrW%Hv2JtL-nKPyAruLb^#O9c=Kg zd%OV`QRkJZCr<{xmw}D;M}Bh>(#Vi34eJ?l3zd}B{s!w6m$r)t>|=tJM_l?+M(|Jf zXShY+Y6jln>X&oCtMh<$)4vEmNd)GD+n^Io)a*&sR_NY zAu+>H5RM{(C{-zFhGrKT7SnDSof}QHVw;-L%%6>9su9F6u3#dH3z%ex^>btJ^G1VV zx)*J`wlC^-KJzAwIHncM$l4bfGJ}>-vANOUrpuUNJze_ezf*m=&pVpl5N1A84dIg9 zk~xMKgRneyBjpk6;wrezP#zxMR_j0yBY}C@q^s1=bf(G>s%TAv+Z|I-u|M=s7}yyP z<~>r#7xN53+A>EN41skLC&PG2Geo)5stI$K*K~?ZmfCf$SGlRlaW@#S-)SV!mGcsy znxVH+j%D6*upJTgDvv>F3CrS5n%*9~^88*hB*&@r<3!4pOiNcuF>-qr=?>kZs`c2uNd>;^=Bs|Mc*)G0<)N+8~6r!NjC>Ku}CAzMj9DHlwOuRA61DUM^@I@ zB`fn|+1wGPvbjUdegTu{en@o5PS%jfGwz?K$T2M87R@iyoa9U>6j8}blJCQ9gs_4; z^45Ps*4>%Pl?9rR9P=Ao>rT pzaQZ-*&vM*)F1_`G+Lk*D1?-!g%zkR#ejUie0WMWLG~HuegSB#YS{n) literal 0 HcmV?d00001 diff --git a/hd-commons-lib/target/classes/main/java/models/requests/CreateUserRequest.class b/hd-commons-lib/target/classes/main/java/models/requests/CreateUserRequest.class index b58874620283773006c6610b700751c657d0f605..3ac40cc6e5d7233aa5af6bf099aa97ad31f12490 100644 GIT binary patch literal 5046 zcmb_fU2_{n7Cmjrk?hF$JCHzNVglH5oN*EY3(AJrj!4Yfj@L>IB+IgGsbftn&4`(i zo$SNb{+itv9-xXWRoNzW3aF?pOQgUtatKU!Eg?zkrSA&OUpI`nYvR^ zHP3X_H%;aFp1I;G>8l5xa<{@QfwV2_N?>BG4N~%5%ib+$wXftbs&x)3Dy`|A@f;@f zPPQRE?|{bW&8ZxwaYk>t&SR^lJb}?rVbiy2W=Z*lVIF%;J9Jjy?rb+&|2r*}bK4W- z>-8Moz zBQ?t>(~_|6-p&(M_6u_l109bfvEV-w)gn&p_@f!y6yuDO5B zbfjm>_5ri5DwZ@$dN!vF11Vr zXyw2XxnXQ+g?%>g82|g+OV&>G=i?@Ci@V{((}qam|o+ z#kjs`l&jK}Wna1E>wG7d_n$R7`5Z6m?C<1c!j;dYy>C6ewW~i~E<1IBcVA|9pon%) zt=a)g^jB+s?6`I5_s8Kf8^In`Oov9bsoT*XGy`lIm&1=eDfpll1yh?*Id^(Fw0VnF zzUWq12d}k`v@wHlY0N2sE3NOxz+UZSzL(Cx4}qbQwQEbi=`u^Mhcysa{*CVPR(7-Q znVVtzDe|RolN_CoHavsgQJtz7zLQAow;#&k=D{d?=h zEn~*`iY+oM{?RqdRvXRwj&koymYi;yPFdErrEBT;Xfy3sE#}lhw~a@)VVZiTQx{V( z(l@rQ{HjygWV+T>n6LI9(m(rTac)~+rn5j=wsdrz?1AN1b>#&OxNDruosf``k}u19 z>#`B?Fr?K7X)Tb`>p0!w*VgE{8POA`3mg1N#(_ZPkb-`hIw8!|Y>&wkjPzBOcQVF_ zzAv24VI6%E7>~8J+!pxo@Lr#u2n?5;rdw8@a+otWyY3B_b$B__;`_+hvg7!=(>KCw z^|II%c*ABk6oM94Xhi*`5ML2SIR^NQ@EPMXIeH59Vc2joXyot>ICtJ^Cy^UYJ2P}Q z0%4QbiE#zKPcmlN`_7&+!-IF(^LZ(`xaK%}%|;TxMj40mRq%LR?koPc;OAoPt%MdUSABPA9+z1zcj#b=jL46WHEg(hx@o_F=fi`MVWJ2Fe zBh-%r)WEr08g;3|x#bST746*ZSa~r49dWUI2rm?9+fyVk@4tlplmrdnPQdRpy^Hw0 zt4&x9O~`SZw_rY>@$kQRe2~BA@;^f4=bs~!zw{g<`Gw~g%b!g@$K?0?n!;cB_Y@_8 zSFpyv?}t)Y#|Gah9|Tr^KNoSYSDFt!ozDg4rE!mIjUVpZAxE2BkEbaNih%;)QAB?H zHK5|($e!U=oELiC9dcg&TY=K+I8u5Yolb=646`xjRdA5--3%25mmLo@NHk>7x7gjeuH2-HM05n z7wpeR$cO2ZZKY2Zf5+E>-KXhCD)7S$-hn|fmpRUh!AQ;T8zfV$Hn7NLcUPe`qdjdK z>DRX3H+^VSJbk!~ds^GnL`$Qo6Fp5G>(|sjU}Vvbu ztat-AJb~;T&%FsWrO9M&?#*e>`M&Rb_xnA2Gh$!;>zn~t$MH{lS{I(NdHT)JwbP3M zPuDiZwN)M3vGEbRCiYx>!oJ96Zqo-EX2fOYiTIkaQYH>X#cn(Ye0XrF=JN^mJPOe8 zl$efLVj2vLB88&(>y#fqBR)V3uu$TAk-q|uP{y37x#c<~6-Q!u^3#|nl1szk=5hI4 zd9ENpg;Fo@lJBDUGgw{e%4d{(fk^<9Ql7g!IZD3DvkBd8nao4OLMX966qT?OBxJ=J z9!M;P66ZY}tTZo$=5%}EoYf}03Ks0b^899uhCS79P(kG~SrIs^v|QRU4&W7>upCkL<^ivk`JzNydlH;|)uY zhDSpWN7#wvpld6<{Hw~`H4ZE2m7D@OWOpOy*7(soZyQ8>3U71DEWE`#yvGM@;WKfY K_!qQrgwg-Na!N!1 diff --git a/hd-commons-lib/target/hd-commons-lib-1.0.0.jar b/hd-commons-lib/target/hd-commons-lib-1.0.0.jar index fb851e27f9d4ac5f711e16544f929a158a55d5c3..693bf9f7cb9bf5092c5d553eeda416c2390dd159 100644 GIT binary patch delta 7650 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 delta 3100 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 Y3qN>isI#0YCuC^Z save(@RequestBody final CreateUserRequest createUserRequest); + ResponseEntity save(@Valid @RequestBody final CreateUserRequest createUserRequest); } diff --git a/user-service-api/src/main/java/br/com/rayankonecny/userserviceapi/controller/exceptions/ControllerExceptionHandler.java b/user-service-api/src/main/java/br/com/rayankonecny/userserviceapi/controller/exceptions/ControllerExceptionHandler.java index ce850a3..5c01d46 100644 --- a/user-service-api/src/main/java/br/com/rayankonecny/userserviceapi/controller/exceptions/ControllerExceptionHandler.java +++ b/user-service-api/src/main/java/br/com/rayankonecny/userserviceapi/controller/exceptions/ControllerExceptionHandler.java @@ -1,29 +1,57 @@ package br.com.rayankonecny.userserviceapi.controller.exceptions; import org.springframework.http.ResponseEntity; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import jakarta.servlet.http.HttpServletRequest; + +import main.java.models.exceptions.ValidationException; import main.java.models.exceptions.ResourceNotFoundException; import main.java.models.exceptions.StandardError; import static java.time.LocalDateTime.now; import static org.springframework.http.HttpStatus.NOT_FOUND; +import java.util.ArrayList; + @ControllerAdvice public class ControllerExceptionHandler { - @ExceptionHandler(ResourceNotFoundException.class) - ResponseEntity handleNotFoundException(final ResourceNotFoundException ex, final HttpServletRequest request) { - return ResponseEntity.status(NOT_FOUND).body( + @ExceptionHandler(ResourceNotFoundException.class) + ResponseEntity handleNotFoundException(final ResourceNotFoundException ex, + final HttpServletRequest request) { + return ResponseEntity.status(NOT_FOUND).body( - StandardError.builder() - .timestamp(now()) - .status(NOT_FOUND.value()) - .error("Resource Not Found") - .message(ex.getMessage()) - .path(request.getRequestURI()) - .build()); - } + StandardError.builder() + .timestamp(now()) + .status(NOT_FOUND.value()) + .error(NOT_FOUND.getReasonPhrase()) + .message(ex.getMessage()) + .path(request.getRequestURI()) + .build()); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + ResponseEntity handleMethodArgumentNotValidException( + final MethodArgumentNotValidException ex, + final HttpServletRequest request) { + var error = ValidationException + .builder() + .timestamp(now()) + .status(NOT_FOUND.value()) + .error("Validation Exception") + .message("Exception in validation attributes") + .path(request.getRequestURI()) + .errors(new ArrayList<>()) + .build(); + + for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) { + error.addError(fieldError.getField(), fieldError.getDefaultMessage()); + } + + return ResponseEntity.badRequest().body(error); + } }