package Ġmic ronaut . kotlin . coroutine . sample . mic ronaut Ċ Ċ import Ġio . kot est . assertions . throw ables . should Throw Exactly Unit Ċ import Ġio . kot est . core . spec . style . String Spec Ċ import Ġio . kot est . matchers . shouldBe Ċ import Ġio . mic ronaut . context . ApplicationContext Ċ import Ġio . mic ronaut . core . annotation . Annotation Value Ċ import Ġio . mic ronaut . core . annotation . Int rospect ed Ċ import Ġio . mic ronaut . test . extensions . kot est . annotation . Mic ronaut Test Ċ import Ġio . mic ronaut . validation . validator . constraints . Constraint Validator Ċ import Ġio . mic ronaut . validation . validator . constraints . Constraint Validator Context Ċ import Ġjava . time . Duration Ċ import Ġjavax . inject . Singleton Ċ import Ġjavax . validation . Constraint Ċ import Ġjavax . validation . Constraint Violation Exception Ċ import Ġjavax . validation . Payload Ċ import Ġjavax . validation . Validator Ċ import Ġjavax . validation . constraints . Assert True Ċ import Ġjavax . validation . constraints . Decimal Max Ċ import Ġjavax . validation . constraints . Max Ċ import Ġjavax . validation . constraints . Min Ċ import Ġjavax . validation . constraints . NotBlank Ċ import Ġjavax . validation . constraints . NotEmpty Ċ import Ġjavax . validation . constraints . NotNull Ċ import Ġjavax . validation . constraints . Size Ċ import Ġjavax . validation . groups . Default Ċ import Ġkotlin . reflect . K Class Ċ Ċ @ Mic ronaut Test Ċ class ĠValidation Test ( ĊĠĠĠ Ġprivate Ġval Ġapplication Context : ĠApplication Context , ĊĠĠĠ Ġprivate Ġval Ġvalidator : ĠValidator , ĊĠĠĠ Ġprivate Ġval Ġbean : ĠBean Ċ ) Ġ: ĠString Spec ({ ĊĠĠĠ Ġ" Data ĠClass Ġvalidation " Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdata Ġclass Ġãģ§ å®ļç¾© ãģĹãģŁ ĠBean Ġãģ® ãĥĲ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ ãĤµ ãĥ³ãĥĹ ãĥ« ĊĠĠĠĠĠĠĠ Ġ// Ġ åĢ¤ è¨Ńå®ļ æĻĤ ãģ«ãģ¯ ãĢģ ãĥĲ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ ãģķãĤĮ ãģªãģĦ ĊĠĠĠĠĠĠĠ Ġval Ġdata Bean Ġ= ĠData Bean ("", Ġ 1 0 ) ĊĠĠĠĠĠĠĠ Ġ// Ġãĥ Ĳ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ ãĥ¡ ãĤ½ãĥĥãĥī ãģ§ ãĥĲ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ çµĲæŀľ ãĤĴåıĸå¾Ĺ ãģĻãĤĭ ĊĠĠĠĠĠĠĠ Ġval Ġconstraint Vi olations Ġ= Ġvalidator . validate ( data Bean ) ĊĠĠĠĠĠĠĠ Ġconstraint Vi olations . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( it . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ" Parameter Ġvalidation " Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġãĥ¡ ãĤ½ãĥĥãĥī ãģ® ãĥĳ ãĥ©ãĥ¡ãĥ¼ãĤ¿ ãĥĲ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ ãĤµ ãĥ³ãĥĹ ãĥ« ĊĠĠĠĠĠĠĠ Ġval Ġnew Bean Ġ= ĠBean () ĊĠĠĠĠĠĠĠ Ġ// ĠDI Ġ ãģĽ ãģļ ãĢģ éĢļå¸¸ çĶŁæĪĲ ãģĹãģŁ ãĤ¯ãĥ©ãĤ¹ ãģ§ãģ¯ ãĢģ ãĥ¡ ãĤ½ãĥĥãĥī ãĥĳ ãĥ©ãĥ¡ãĥ¼ãĤ¿ ãĥĲ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ ãģ¯ æ©Łèĥ½ ãģĹãģªãģĦ ãĢĤ ĊĠĠĠĠĠĠĠ Ġnew Bean . valid Params ("") ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġvalidator . validate ( new Bean ) ĊĠĠĠĠĠĠĠ Ġprintln ( result . size ) ĊĊĠĠĠĠĠĠĠ Ġval Ġexception Ġ= Ġshould Throw Exactly Unit < Constraint Violation Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDI Ġ ãģĹãģŁ ĠBean Ġãģ¯ ãĢģ ãĥ¡ ãĤ½ãĥĥãĥī ãĥĳ ãĥ©ãĥ¡ãĥ¼ãĤ¿ ãĥĲ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ ãģĮ æľī åĬ¹ ãģ¨ ãģªãĤĭ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbean . valid Params ("") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln ( exception . message ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ" Field Ġvalidation " Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġãĥķ ãĤ£ ãĥ¼ãĥ« ãĥī ãĥĳ ãĥ©ãĥ¡ãĥ¼ãĤ¿ ãģ® ãĥĲ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ ãĤµ ãĥ³ãĥĹ ãĥ« ĊĠĠĠĠĠĠĠ Ġval Ġpo jo Bean Ġ= ĠPo jo (" 1 ", Ġnull ) ĊĠĠĠĠĠĠĠ Ġ// Ġãĥķ ãĤ£ ãĥ¼ãĥ« ãĥī ãĥĳ ãĥ©ãĥ¡ãĥ¼ãĤ¿ ãģ« ãĥĲ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ ãĤĴæĮĩå®ļ ãģĹãģŁ åł´åĲĪ ãĢģ åį³ åº§ ãģ«ãģ¯ ãĥĲ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ ãģķãĤĮ ãģªãģĦ ĊĠĠĠĠĠĠĠ Ġpo jo Bean . flag True Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġpo jo Bean . decimal Max 1 0 Ġ= Ġ 1 1 ĊĠĠĠĠĠĠĠ Ġpo jo Bean . decimal Max Str 1 0 Ġ= Ġ" 1 1 " ĊĠĠĠĠĠĠĠ Ġpo jo Bean . max 1 0 Ġ= Ġ 1 1 ĊĊĠĠĠĠĠĠĠ Ġ// Ġãĥ Ĳ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ ãĤĴå®Łè¡Į ĊĠĠĠĠĠĠĠ Ġval Ġconstraint Vi olations Ġ= Ġvalidator . validate ( pojo Bean ) ĊĠĠĠĠĠĠĠ Ġ// Ġãĥ Ĳ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ çµĲæŀľ ãĤĴ ç¢ºèªį ĊĠĠĠĠĠĠĠ Ġconstraint Vi olations . forEach Ġ{ Ġprintln ( it . message ) Ġ} ĊĠĠĠĠĠĠĠ Ġconstraint Vi olations . size ĠshouldBe Ġ 6 ĊĠĠĠ Ġ} ĊĠĠĠ Ġ" Custom Ġmessage Ġvalidation " Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġãĥ Ĳ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ æĻĤ ãģ® ãĥ¡ ãĥĥãĤ»ãĥ¼ãĤ¸ ãĤĴ å¤īæĽ´ ãģĻãĤĭ ãĤµ ãĥ³ãĥĹ ãĥ« ĊĠĠĠĠĠĠĠ Ġprintln (" Start ĠCustom Ġmessage Ġvalidation ") ĊĠĠĠĠĠĠĠ Ġval Ġcustom Bean Ġ= ĠCustom Validation Bean () ĊĠĠĠĠĠĠĠ Ġcustom Bean . val 1 Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġcustom Bean . val 2 Ġ= Ġ 2 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġvalid Result Ġ= Ġvalidator . validate ( custom Bean ) ĊĠĠĠĠĠĠĠ Ġvalid Result . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( it . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( it . message Template ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln (" Finish ĠCustom Ġmessage Ġvalidation ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġ" Group Ġvalidation " Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġãĥ Ĳ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ ãĤĴ ãĤ° ãĥ«ãĥ¼ãĥĹ åĮĸ ãģĻãĤĭ ãĤµ ãĥ³ãĥĹ ãĥ« ĊĠĠĠĠĠĠĠ Ġprintln (" Start ĠGroup Ġvalidation ") ĊĠĠĠĠĠĠĠ Ġ// Ġãĥ Ĳ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ å¯¾è±¡ ãģ® ãĤ° ãĥ«ãĥ¼ãĥĹ ãĤĴæĮĩå®ļ ĊĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġãĥĩ ãĥķãĤ© ãĥ« ãĥĪ ãģ® ãģ¿ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGroup A Ġãģ® ãģ¿ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Group A :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGroup B Ġãģ® ãģ¿ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Group B :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġãĥĩ ãĥķãĤ© ãĥ« ãĥĪ ãģĬãĤĪãģ³ ãĢģ Group A ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Default :: class . java , ĠGroup A :: class . java ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġgroups Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("-- Ġgroups : Ġ[ ${ groups . join ToString Ġ{ Ġit . simple Name Ġ}} ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= ĠGroup Validation Bean () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . group Default Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . group A Ġ= Ġ 2 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . group AB Ġ= Ġ 2 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġvalidator . validate ( b , Ġ* groups ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("${ it . property Path }: Ġ${ it . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln (" Finish ĠGroup Ġvalidation ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġ" Constructor Ġvalidation " Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠãĤ³ ãĥ³ ãĤ¹ãĥĪ ãĥ© ãĤ¯ ãĤ¿ ãĥĲ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ ãģ® ãĤµ ãĥ³ãĥĹ ãĥ« ĊĠĠĠĠĠĠĠ Ġprintln (" Start ĠConstructor Ġvalidation ") ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= ĠConstructor Validation Bean (" nam ", Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġvalidator . validate ( b ) ĊĠĠĠĠĠĠĠ Ġresult . forEach Ġ{ Ġprintln ("${ it . property Path }: Ġ${ it . message }") Ġ} ĊĠĠĠĠĠĠĠ Ġprintln (" Finish ĠConstructor Ġvalidation ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġ" Def ining ĠAdditional ĠConstraints " Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Start ĠDef ining ĠAdditional ĠConstraints ") ĊĠĠĠĠĠĠĠ Ġ// Ġ æĸ° è¦ı ãģ« ãĥĲ ãĥª ãĥĩãĥ¼ãĤ¿ ãĤĴä½ľæĪĲ ãģĻãĤĭ ãĤµ ãĥ³ãĥĹ ãĥ« ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġapplication Context . getBean ( H oliday Service :: class . java ) ĊĠĠĠĠĠĠĠ Ġ// Ġ æŃ£å¸¸ ãģ« è¨Ńå®ļ ãģĻãĤĭ åł´åĲĪ ĊĠĠĠĠĠĠĠ Ġb . start H oliday (" F red ", Ġ" P 2 D ") ĊĠĠĠĠĠĠĠ Ġval Ġexception Ġ= Ġshould Throw Exactly Unit < Constraint Violation Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġä¸į æŃ£ ãģª Ġduration Ġ åĢ¤ ãĤĴè¨Ńå®ļ ãģĻãĤĭ åł´åĲĪ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb . start H oliday (" F red ", Ġ" j unk ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln ( exception . message ) ĊĠĠĠĠĠĠĠ Ġprintln (" Finish ĠDef ining ĠAdditional ĠConstraints ") ĊĠĠĠ Ġ} Ċ Ċ }) Ċ Ċ // ĠDI ĠçĶ¨ ĠBean Ċ @ Singleton Ċ open Ġclass ĠBean Ġ{ ĊĠĠĠ Ġ// Ġãĥ Ĳ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ ãĤĴ å¼ķ æķ° ãģ« è¨Ńå®ļ ãģĹãģŁ åł´åĲĪãģ¯ ãĢģ åĳ¼ ãģ³ åĩº ãģĹ æĻĤ ãģ« åį³ åº§ ãģ« ãĥĲ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ ãģķãĤĮãĤĭ ãĢĤ ĊĠĠĠ Ġ// ĠA OP ĠãĤ¢ ãĥİ ãĥĨ ãĥ¼ãĤ·ãĥ§ãĥ³ ãĤĴ ä»ĺ ä¸İ ãģĻãĤĭ åł´åĲĪ ãĢģ ãģĭ ãģª ãĤī ãģļ Ġopen Ġ å®ļç¾© ãģĮ å¿ħè¦ģ ãĢĤ ĊĠĠĠ Ġopen Ġfun Ġvalid Params (@ NotBlank Ġname : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Hello Ġ$ name ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ // ĠPo jo ĠBean Ġãģ§ ãĥĲ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ ãĤĴ ãģĻãĤĭ åł´åĲĪãģ¯ ãĢģ @ Int rospect ed ĠãģĮ å¿ħ éł Ī ãģ¨ ãģªãĤĭ ãĢĤ Ċ @ Int rospect ed Ċ class ĠPo jo ( ĊĠĠĠ Ġ@ field : Size ( min Ġ= Ġ 5 , Ġmax Ġ= Ġ 1 0 ) Ġvar Ġparam 1 : ĠString , ĊĠĠĠ Ġ@ field : NotNull Ġval Ġparam 2 : ĠInt ? Ċ ) Ġ{ ĊĠĠĠ Ġ@ field : Assert True ĊĠĠĠ Ġvar Ġflag True : ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġ@ field : Decimal Max (" 1 0 ") ĊĠĠĠ Ġvar Ġdecimal Max 1 0 : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ@ field : Decimal Max (" 1 0 ") ĊĠĠĠ Ġvar Ġdecimal Max Str 1 0 : ĠString Ġ= Ġ" 0 " ĊĊĠĠĠ Ġ@ field : Max ( 1 0 ) ĊĠĠĠ Ġvar Ġmax 1 0 : ĠInt Ġ= Ġ 0 Ċ } Ċ Ċ // Ġdata Ġclass ĠãĤĴ ãĥĲ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ ãģĻãĤĭ ãĤµ ãĥ³ãĥĹ ãĥ« Ċ // ĠData ĠBean Ġãģ§ ãĥĲ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ ãĤĴ ãģĻãĤĭ åł´åĲĪãģ¯ ãĢģ @ Int rospect ed ĠãģĮ å¿ħ éł Ī ãģ¨ ãģªãĤĭ ãĢĤ Ċ @ Int rospect ed Ċ data Ġclass ĠData Bean ( ĊĠĠĠ Ġ// Ġãĥ Ĳ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ ãģ¯ ãĢģ ä»£ åħ¥ æĻĤ ãģ«ãģ¯ è¡Į ãĤı ãĤĮ ãģªãģĦ ĊĠĠĠ Ġ@ field : NotBlank Ġvar Ġname : ĠString , ĊĠĠĠ Ġ@ field : Min ( 1 8 ) Ġvar Ġage : ĠInt Ċ ) Ċ Ċ // Ġãĥ¡ ãĥĥãĤ»ãĥ¼ãĤ¸ ãĤĴ å¤īæĽ´ ãģĻãĤĭ ãĤµ ãĥ³ãĥĹ ãĥ« Ċ @ Int rospect ed Ċ class ĠCustom Validation Bean Ġ{ ĊĠĠĠ Ġ// Ġãĥ¡ ãĥĥãĤ»ãĥ¼ãĤ¸ ãĤĴ æĽ¸ ãģį æıĽ ãģĪãĤĭ ï¼Ī { validated Value } Ġãģ¯ ãĢģ åħ¥åĬĽ åĢ¤ ãģ§ ãĢģ { value } Ġãģ¯ ãĢģ åĪ¶ éĻĲ åĢ¤ ï¼ī ĊĠĠĠ Ġ@ field : Max ( value Ġ= Ġ 1 0 , Ġmessage Ġ= Ġ"{ validated Value } Ġãģ¯ ãĢģ { value } Ġ ä»¥ä¸ĭ ãģ§ åħ¥åĬĽ ãģĹãģ¦ãģıãģłãģķãģĦ ãĢĤ ") ĊĠĠĠ Ġvar Ġval 1 : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ// Ġãĥ¡ ãĥĥãĤ»ãĥ¼ãĤ¸ ä¸Ń ãģ« ãĥĨ ãĥ³ãĥĹ ãĥ¬ ãĥ¼ãĥĪ ãģ® åħ¥ ãĤĮ åŃĲ ãĤĴ ãģĻãĤĭ ĊĠĠĠ Ġ@ field : Max ( value Ġ= Ġ 1 0 , Ġmessage Ġ= Ġ" val 2 Ġãģ¯ ãĢģ { javax . validation . constraints . Max . message }") ĊĠĠĠ Ġvar Ġval 2 : ĠInt Ġ= Ġ 0 Ċ } Ċ Ċ // Ġãĥ Ĳ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ ãģ® ãĤ° ãĥ«ãĥ¼ãĥĹ åĮĸ Ċ // Ġãĥ Ĳ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ çĶ¨ ãģ® ãĤ° ãĥ«ãĥ¼ãĥĹ ãĤĴ å®ļç¾© Ċ interface ĠGroup A Ċ interface ĠGroup B Ċ Ċ @ Int rospect ed Ċ class ĠGroup Validation Bean Ġ{ ĊĠĠĠ Ġ// Ġgroups Ġ æľª æĮĩå®ļ ãģ® åł´åĲĪ ãĢģ javax . validation . groups . Default Ġãģ¨ ãģªãĤĭ ĊĠĠĠ Ġ@ field : Max ( value Ġ= Ġ 1 0 ) ĊĠĠĠ Ġvar Ġgroup Default : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ@ field : Max ( value Ġ= Ġ 1 0 , Ġgroups Ġ= Ġ[ Group A :: class ]) ĊĠĠĠ Ġvar Ġgroup A : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ@ field : Max ( value Ġ= Ġ 1 0 , Ġgroups Ġ= Ġ[ Group A :: class , ĠGroup B :: class ]) ĊĠĠĠ Ġvar Ġgroup AB : ĠInt Ġ= Ġ 0 Ċ } Ċ Ċ // ĠãĤ³ ãĥ³ ãĤ¹ãĥĪ ãĥ© ãĤ¯ ãĤ¿ ãĥĲ ãĥª ãĥĩ ãĥ¼ãĤ·ãĥ§ãĥ³ Ċ @ Int rospect ed Ċ class ĠConstructor Validation Bean ( ĊĠĠĠ Ġ@ field : Size ( min Ġ= Ġ 5 , Ġmax Ġ= Ġ 1 0 ) Ġvar Ġname : ĠString , ĊĠĠĠ Ġ@ field : NotBlank Ġvar Ġmemo : ĠString Ċ ) Ċ Ċ // Ġ æĸ° è¦ı ãĥĲ ãĥª ãĥĩãĥ¼ãĤ¿ ãĤĴ å®ļç¾© ãģĻãĤĭ ãĤµ ãĥ³ãĥĹ ãĥ« Ċ // ĠãĤ¢ ãĥİ ãĥĨ ãĥ¼ãĤ·ãĥ§ãĥ³ ãĤĴ å®ļç¾© Ċ @ Retention ( Annotation Retention . RUNTIME ) Ċ // Ġãĥ Ĳ ãĥª ãĥĩãĥ¼ãĤ¿ ãģ® å®£ è¨Ģ Ċ // Ġmic ronaut - hibernate - validator Ġ ãĥ©ãĤ¤ ãĥĸãĥ© ãĥª ãĤĴ åĪ©çĶ¨ ãģĻãĤĭ åł´åĲĪãģ¯ ãĢģ ãĥĲ ãĥª ãĥĩãĥ¼ãĤ¿ å®Ł è£ħ ãĤ¯ãĥ©ãĤ¹ ãĤĴæĮĩå®ļ ãģĻãĤĭå¿ħè¦ģ ãģĮãģĤãĤĭ ãĢĤ Ċ // Ġ ç©º ï¼Ī validated By Ġ= Ġ[] ï¼ī ãģ« ãģĻãĤĭãģ¨ ä»¥ä¸ĭãģ® ãĤĪãģĨ ãģª ãĤ¨ãĥ© ãĥ¼ ãģ¨ ãģªãĤĭ ãĢĤ Ċ // ĠH V 0 0 0 0 3 0 : ĠNo Ġvalidator Ġcould Ġbe Ġfound Ġfor Ġconstraint Ġ' mic ronaut . kotlin . coroutine . sample . mic ronaut . Duration Pattern ' Ġvalidating Ġtype Ġ' java . lang . String '. ĠCheck Ġconfiguration Ġfor Ġ' start H oliday . duration ' Ċ // Ġ ãģĹãģŁ ãģĮ ãģ£ãģ¦ ãĢģ ï¼ ł Factory Ġãģ§ ãģ® å®ļç¾© ãĤĤ ãģ§ãģį ãģªãģĦ ãĢĤ Ċ @ Constraint ( validated By Ġ= Ġ[ My Validator :: class ]) Ċ annotation Ġclass ĠDuration Pattern ( ĊĠĠĠ Ġ// Ġmic ronaut - hibernate - validator Ġ ãĥ©ãĤ¤ ãĥĸãĥ© ãĥª ãĤĴ åĪ©çĶ¨ ãģĻãĤĭ åł´åĲĪ ãĢģ ä»¥ä¸ĭãģ® 3 ãģ¤ ãģ¯ ãĢģ å¿ħ ãģļ å®ļç¾© ãģĻãĤĭå¿ħè¦ģ ãģĮãģĤãĤĭ ãĢĤ ãģķ ãĤĤ ãģªãģı ãģ° ä»¥ä¸ĭãģ® ãĤĪãģĨ ãģª ãĤ¨ãĥ© ãĥ¼ ãģ¨ ãģªãĤĭ ãĢĤ ĊĠĠĠ Ġ// ĠH V 0 0 0 0 7 4 : Ġmic ronaut . kotlin . coroutine . sample . mic ronaut . Duration Pattern Ġcontains ĠConstraint Ġannotation , Ġbut Ġdoes Ġnot Ġcontain Ġa Ġmessage Ġparameter . ĊĠĠĠ Ġ// ĠH V 0 0 0 0 7 4 : Ġmic ronaut . kotlin . coroutine . sample . mic ronaut . Duration Pattern Ġcontains ĠConstraint Ġannotation , Ġbut Ġdoes Ġnot Ġcontain Ġa Ġgroups Ġparameter . ĊĠĠĠ Ġ// ĠH V 0 0 0 0 7 4 : Ġmic ronaut . kotlin . coroutine . sample . mic ronaut . Duration Pattern Ġcontains ĠConstraint Ġannotation , Ġbut Ġdoes Ġnot Ġcontain Ġa Ġpayload Ġparameter . ĊĠĠĠ Ġval Ġmessage : ĠString Ġ= Ġ" invalid Ġduration Ġ({ validated Value })", ĊĠĠĠ Ġval Ġgroups : ĠArray < K Class < out ĠAny >> Ġ= Ġ[], ĊĠĠĠ Ġval Ġpayload : ĠArray < K Class < out ĠPayload >> Ġ= Ġ[] Ċ ) Ċ Ċ // Ġ æĸ° è¦ı ãĥĲ ãĥª ãĥĩãĥ¼ãĤ¿ ãģ® å®Ł è£ħ Ċ // Ġ@ Factory Ġãģ§ çĦ¡ åĲį ãĤ¯ãĥ©ãĤ¹ ãĤĴ çĶŁæĪĲ ãģĻãĤĭ æĸ¹æ³ķ Ċ // Ġmic ronaut - hibernate - validator Ġ ãĥ©ãĤ¤ ãĥĸãĥ© ãĥª ãĤĴ åĪ©çĶ¨ ãģĹãģªãģĦ åł´åĲĪ ãģ® ãģ¿ ãģĵãģ® æĸ¹æ³ķ ãģĮ åı¯èĥ½ Ċ // ĠãĥķãĤ ¡ ãĤ¯ãĥĪ ãĥª ãģ§ ãĢģ å®Ł è£ħ ãĤ¯ãĥ©ãĤ¹ ãĤĴ ãĤ¤ãĥ³ ãĤ¹ãĤ¿ ãĥ³ãĤ¹ åĮĸ ãģĹãģ¦ æ¸ ¡ ãģĻ æĸ¹æ³ķ ãĤĤ ãĤ¨ãĥ© ãĥ¼ ãģ¨ ãģª ãģ£ãģ¦ ãģĹãģ¾ ãģĨ ãĢĤ Ċ //@ Factory Ċ // class ĠMy Validator Factory Ġ{ Ċ // ĠĠĠ Ġ// Ġãĥ¡ ãĤ½ãĥĥãĥī ãģ® æĪ » ãĤĬ åĢ¤ ãģ§ ãĢģ ãĤ¢ ãĥİ ãĥĨ ãĥ¼ãĤ·ãĥ§ãĥ³ ãģ¨ éĸ¢ éĢ£ ä»ĺ ãģĦ ãģ¦ãģĦãĤĭ Ċ // ĠĠĠ Ġ@ Singleton Ċ // ĠĠĠ Ġfun Ġduration Pattern Validator (): ĠConstraint Validator < Duration Pattern , ĠCharSequence > Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġreturn ĠConstraint Validator Ġ{ Ġvalue , Ġ_, Ġ_ Ġ-> Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ== Ġnull Ġ|| Ġvalue . toString (). matches ("^ PT ?[ \\ d ]+ [ SM HD ]{ 1 }$ ". to Regex ()) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ //} Ċ Ċ // Ġ æĸ° è¦ı ãĥĲ ãĥª ãĥĩãĥ¼ãĤ¿ ãģ® å®Ł è£ħ Ċ // Ġ ãĤ¯ãĥ©ãĤ¹ ãĤĴ å®Ł è£ħ ãģĻãĤĭ æĸ¹æ³ķ Ċ // Ġmic ronaut - hibernate - validator Ġ ãĥ©ãĤ¤ ãĥĸãĥ© ãĥª ãĤĴ åĪ©çĶ¨ ãģĻãĤĭ åł´åĲĪ ãĢģ ãĤ¯ãĥ©ãĤ¹ å®ļç¾© ãģĮ å¿ħ éł Ī Ċ // Ġ ãģª ãģ ľ ãģª ãĤī ãĢģ ãĤ¢ ãĥİ ãĥĨ ãĥ¼ãĤ·ãĥ§ãĥ³ å®ļç¾© ãģ« ãĢģ ãģĵãģ® ãĤ¯ãĥ©ãĤ¹ ãĤĴæĮĩå®ļ ãģĻãĤĭå¿ħè¦ģ ãģĮãģĤ ãĤĬ ãĢģ çĦ¡ åĲį ãĤ¯ãĥ©ãĤ¹ ãģ§ãģ¯ è¨Ńå®ļ ãģ§ãģį ãģªãģĦ ãģŁãĤģ ãĢĤ Ċ class ĠMy Validator Ġ: ĠConstraint Validator < Duration Pattern , ĠCharSequence > Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠisValid ( ĊĠĠĠĠĠĠĠ Ġvalue : ĠCharSequence ?, ĊĠĠĠĠĠĠĠ Ġannotation Metadata : ĠAnnotation Value < Duration Pattern >, ĊĠĠĠĠĠĠĠ Ġcontext : ĠConstraint Validator Context ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue Ġ== Ġnull Ġ|| Ġvalue . toString (). matches ("^ PT ?[ \\ d ]+ [ SM HD ]{ 1 }$ ". to Regex ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ // Ġ æĸ° è¦ı ãĥĲ ãĥª ãĥĩãĥ¼ãĤ¿ ãģ® åĪ©çĶ¨ ä¾ĭ Ċ @ Singleton Ċ open Ġclass ĠH oliday Service Ġ{ ĊĠĠĠ Ġopen Ġfun Ġstart H oliday (@ NotEmpty Ġp ersion : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Duration Pattern Ġduration : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġd Ġ= ĠDuration . parse ( duration ) ĊĠĠĠĠĠĠĠ Ġval Ġmins Ġ= Ġd . to Minutes () ĊĠĠĠĠĠĠĠ Ġreturn Ġ" person Ġ$ per sion Ġis Ġoff Ġon Ġh oliday Ġfor Ġ$ mins Ġminutes " ĊĠĠĠ Ġ} Ċ } Ċ