دليل الحزم والتكوين
استيراد حزم JSR 303 و Bleibernate حزم صالحة
<Rependency> <roupeD> org.hibernate.validator </groupId> <intifactid> hibernate-validator </artifactid> <sored> 6.0.5. <splect> 2.0.0.final </splement> </sependency>
تكوين Springboot
الموارد/التطبيق.
ربيع:
رسائل:
الاسم الأساسي: قاعدة ، ملفات الموارد todo # base.properties و todo.properties ، مفصولة بفواصل
الترميز: يجب تحديد ترميز التحليل UTF-8 # ، وإلا
تكوين في فئة بدء تشغيل Springboot
يمتد تطبيق SPRINGBOOTAPPlicationPublicPublicpublicpublic WebMVCConfigureRadapter {value ("$ {spring.messages.basename}") سلسلة خاصة ؛ public static void main (string [] args) {SpringApplication.run (application.class ، args) ؛ } bean @publicary messagesource messagesource () {ResourceBundleMessagesource ResourceBundleMessagesource = new ResourceBundleMessagesource () ؛ ResourceBundleMessagesource.setUseCodeasDefaultMessage (false) ؛ ResourceBundleMessagesource.setDefaultEncoding ("UTF-8") ؛ // كرر تعريف ResourceBundLemessagesource.setBasenames (basename.split ("،")) ؛ إرجاع ResourceBundleMessagesource ؛ } bean@primary public localValIdatorFactoryBean Validator () {localValIdatorFactoryBean ValidatorFactoryBean = new LocalValidatorFactoryBean () ؛ ValitatorFactoryBean.setProviderClass (hibernatevalidator.class) ؛ ValitatorFactoryBean.setValidationMessagesource (MessageSource ()) ؛ إرجاع ValitatorFactorybean ؛ } Override Public Validator getValidator () {return Validator () ؛ } / *** يتم تمكين التحقق من المعلمة الفردية على مستوى الطريقة* / bean public methodValidationPostProcessor methodValidationPostProcessor () {return new MethodValidationPostProcessor () ؛ }}نقوم بمعالجة الاستثناءات التي لا يمكنها اجتياز معلمات التحقق ولا يمكنها تمريرها ، والتي من خلال التقاط استثناء موحد.
@controllerAdvice @componentpublic class bindValidexceptionHandler {responsestatus (value = httpstatus.ok) exceptionHandler (constraintviolation.class) public responsebody msg handleconstraintviolationexception (constrintviolationexception e) E.GetConstraintViolations (). iterator (). التالي (). getMessageTemplate () ؛ إرجاع msg.error (messageTemplate) ؛ } Responsestatus (value = httpstatus.ok) exceptionHandler (bindException.class) publicresponsebody msg handleBindException (bindException e) {bindingResult BindingResult = e.getBindingResult () ؛ سلسلة className = bindingResult.getTarget (). getClass (). getName () ؛ fielderror التالي = bindingResult.getFielderRors (). iterator (). next () ؛ سلسلة fieldName = next.getField () ؛ سلسلة defaultMessage = next.getDefaultMessage () ؛ if (pattern.compile ("intervalalArgumentException: no enum"). matcher (defaultMessage) .Find ()) {matcher matcher = pattern.compile ("for value '(.*؟)'"). matcher (defaultMessage) ؛ if (matcher.find ()) {defaultMessage = "لا يمكن العثور على نوع التعداد [" + matcher.group (1) + "]" ؛ }} return msg.error (defaultMessage) ؛ } responsestatus (value = httpstatus.ok) exceptionHandler (validerror.class) publicResponsebody msg genaldvaliderror (validerror e) {return msg.error (e.getMessage ()) ؛ }}الموارد/base.propertie
لا يمكن أن يكون معرف CreatorId = {value}.
ModifierId = معرف المعدل لا يمكن أن يكون أقل من {value}.
الموارد/todo.properties
TODO.PRIVALID.MIN = المعرف الخاص لا يمكن أن يكون أقل من {value}.
استخدم التعليقات التوضيحية على حقل الفول ، حيث تشير واجهات C و S في المجموعة إلى اختصار وحدة التحكم والخدمة ، والتي تشمل واجهة إدراج ، واجهة التحديث ، وما إلى ذلك ، والتي هي جميع الاتفاقيات المخصصة.
/*** المعرف الخاص هو المفتاح الأجنبي الذي يمثل جداول متعددة مثل مهام المشروع/المهام غير المشتركة/المخاطر/المشكلات/المراجعة أسئلة المهام*/@min (value = 1 ، message = "{toDo.privateid.min}" ، المجموعات الخاصة */@min (value = 1 ، message = "{creatorId}" ، المجموعات = {s.insert.class}) خاص creatorId ؛ تحكم طبقة التحكم في صحة@restController@requestMapping ("TODO") getMapping ("getVo") public msg getVo (min (value = 1 ، message = "لا يمكن أن يكون المعرف أقل من 1.") @requestparam (مطلوب = false ، defaultValue = "0") معرف طويل) {إرجاع this.todoservice.getvo (id) ؛ } postmapping ("add") msg public add ( @validated ({c.insert.class}) tode tode) {return this.todoservice.add (todo) ؛ }}تعلن Validated ({c.insert.class}) لتمكين مجموعات التحقق من شرح الفول ، ولن تؤدي مجموعات التحقق الأخرى التحقق ، والتي يمكن تمييزها للتحقق المنفصل.
على سبيل المثال ، إذا لم يكن هناك كيان ونوع بيانات أساسي واحد فقط ، فيمكن التحقق منه ، ولكن يجب تلبية ثلاثة شروط:
تحقق بنفسك.
طبقة الخدمة طبقة التحقق من AOP
فئة أدوات ValiatUtil
يجب أن يتم فحصها وتسجيلها كحالة واحدة من قبل سبرينغ بوت
componentpublic class alvaluTil {autowired private Validator ؛ public <t> set <constrentviolation <T >> التحقق (كائن t ، الفئة <؟> ... مجموعات) {return adadator.validate (كائن ، مجموعات) ؛ } public <t> set <crosnaintViolation <T >> ValidateValue (class <t> beantype ، string propertyName ، قيمة الكائن ، الفئة <؟ } / *** تحقق من المعلمة وإرجاع موجه الخطأ الأول* param t كائن تم التحقق منه* param مجموعات التحقق* param <t> النوع الأصلي قبل أن يمسح الكائن* @ @REGRENT* / public <t> void validentrenturnfirstips (t t ، class <؟ if (validate.size ()> 0) {constraintViolation <T> next = validate.iterator (). next () ؛ رسالة سلسلة = next.getRootBeanClass (). getName () + "-" + next.getPropertyPath () + "-" + next.getMessage () ؛ رمي Validerror الجديد (رسالة) ؛ }} / *** تحقق من المعلمة وأرجع أول موجه الخطأ* param targetclass نوع الفئة للكائن الذي تم التحقق منه* @Param FieldName name الذي يحتاج OBJ ، class <؟> ... مجموعات) {SET <constraintViolation <T >> validate = validator.validateValue (TargetClass ، FieldName ، OBJ ، المجموعات) ؛ if (validate.size ()> 0) {string message = targetclass.getName () + "-" + fieldname + "-" + validate.iterator (). next (). getMessage () ؛ رمي Validerror الجديد (رسالة) ؛ }}}تكوين AOP
المبدأ الرئيسي هو استخدام طريقة اعتراض AOP لتنفيذ المعلمات والحصول على تعليقات توضيحية للمعلمات. ثم استخدم فئة الأدوات للتحقق من المعلمات. إذا فشل التحقق ، فسيتم طرح خطأ مخصص مباشرة ، وتم معالجة الخطأ المخصص على مستوى العالم.
@Side @ComponentPublic Class ValidatorAop {Autowired private validuTil validuTil ؛ /*** تحديد قواعد الاعتراض: اعتراض جميع الفئات الموجودة أسفل حزمة Com.Service ، هناك طرق مع شرح Service. */ @pointcut ("التنفيذ (*com.service ..*(..)) و annotation (org.springframework.stereotype.service)") public void controlrermeThodPointCut () {}/ ***تطبيق محدد لـ interceptor*/ around ( يمكنك أيضًا كتابة مباشرة "التنفيذ (* com.xjj .........)" في هذا الاعتراض على الكائن العام (proseingJoinPoint PJP) {methodsignatureatureatureatureatureatureatureatureatureatureatureatureatureatureatureatureatureatureatureatureatureatureatureatureatureatureature (methodesignature) pjp.getSignature () ؛ طريقة الطريقة = maysIngIgnature.getMethod () ؛ التعليق التوضيحي [] [] argannotations = method.getParameterAnnotations () ؛ Object [] args = pjp.getargs () ؛ لـ (int i = 0 ؛ i <args.length ؛ i ++) {for (التعليق التوضيحي: argannotations [i]) {if (addderated.class.isinstance (annotation)) {التحقق من صحة = (تم التحقق من صحة) ؛ الفئة <؟> [] مجموعات = صحة. value () ؛ ValitUtil.ValidAndReturnFirsterRortips (args [i] ، مجموعات) ؛ }} حاول {return pjp.proceed (args) ؛ } catch (throwable throwable) {throwable.printStackTrace () ؛ } إعادة صواب ؛ }}تحقق من التعليق التوضيحي min @notnull طريقة الاستخدام
لا يمكن كتابتها على فئة التنفيذ ، ويمكن استخدام التعليقات التوضيحية فقط في الواجهة
في الأساس بنفس طريقة وحدة التحكم
ValidatedPublic Interface Todoservice { / *** Query Single-Do* @Param ID الرقم التسلسلي* RETURN واحد مهام* / msg getvo (min (value = 1 ، message = "لا يمكن أن يكون معرف الهوية أقل من 1.") معرف طويل) ؛ / *** أضف بيانات* param todo كائن*/ msg add ( @validated ({s.insert.class}) todo todo) ؛}شارك بعض تعليقات التحقق المخصصة
سلسلة التحقق الفارغة
package javax.validation.constraints ؛ import javax.validation.constraint ؛ import javax.validation.constraintvalidator ؛ import javax.validation.constaintvalidatorcontext لا يمكن استخدامه ويحتاج إلى إعادة كتابة. لا يمكن تغيير الحزمة. */@docited@crodrint (addderatedby = {notblank.notblankvalidator.class})@target ({elementType.field ، elementType.annotation_type ، elementType.Parameter}) entention (entrypolicy.runtime) public interface notblank {class <؟ سلسلة الرسائل () الافتراضية "{notblank}" ؛ الفئة <؟ يمتد Payload> [] Payload () افتراضي {} ؛ class notblankvalidator تنفذ constraintvalidator <notblank ، object> {public notblankvalidator () {} override public void تهيئة (notblank corntantannotation) {} @override boolean isValid (compult value ، constrontvalidatorcontext) }}}اكتب الحكم ، لتحديد ما إذا كان النوع أحد القيم ، يمكنك تخصيص الحكم بناءً على مجموعة التحقق
الموارد/todo.propertiestodo.todotype.insert = عند إضافتها حديثًا ، يمكن أن يكون نوع المهام فقط واحدة من المهام غير المشروع أو مهام المشروع أو المشكلات. TODO.TODYTOME.UPDATE = عند التعديل ، لا يمكن أن يكون نوع المهام سوى أحد المخاطر ومراجعة مشكلات المهام. Bean/*** todotype0non-project task1project task2problem3risk4reviewTodyotypoTypevalId (value = {"0" ، "1" ، "2"} ، message = "{toDo.todotype.insert}" ، groups = {c.insert.class ، s.insert.class} message = "{toDo.todotype.update}" ، المجموعات = {c.update.class ، s.update.class}) سلسلة خاصة ؛التعليقات التوضيحية المخصصة
@documented@vertrient (addactedBy = {toDOtimeValid.TodypeValIdfactory.class})@target ({elementType.field ، elementType.annotation_type ، elementType.Parameter})@strententing (attreentionpolicy.runtime)@repeadfield Message () الافتراضي "الرجاء إدخال النوع الصحيح" ؛ String [] value () default {} ؛ الفئة <؟> [] المجموعات () الافتراضي {} ؛ الفئة <؟ يمتد Payload> [] Payload () افتراضي {} ؛ فئة TODOTOTINGEPEVALIDFACTORY تنفذ constraintValIdator <toDotypevalId ، string> {private string [] annotationValue ؛ Override public void تهيئة (todotypevalid todostatusvalid) {this.annotationValue = todostatusvalid.value () ؛ } Override public boolean isValid (قيمة السلسلة ، سياق constrentvalidatorcontext) {if (arrays.aslist (annotationValue) .Contains (value)) return true ؛ العودة كاذبة }} target ({elementType.field ، elementType.annotation_type ، elementType.Parameter}) الاحتفاظ (attreentionpolicy.runtime) documented interface list {todotypevalid [] value () ؛ }}repeatable (ToDotypevalid.list.class) هي نفس ميزة التعليقات المتعددة الزمنية التي تدعمها JDK8.
وفقًا لما ورد أعلاه ، يمكن استخدامه أيضًا في فصول التعداد.
عندما تكون الموارد/todo.propertiestodo.todostatus.insert = إضافة إلى جديد ، لا يمكن بدء الحالة إلا. عندما يتم تعديل todo.todostatus.update = ، يمكن أن تكون الحالة قيد التقدم أو الانتهاء. Bean/*** todo status 0 لم تبدأ 1 في التقدم 2 مكتملة*/@todostatusvalid (enums = {todostatus.not_started} ، message = "{toDo.todostats.insert}" ، المجموعات = {c.insert.class ، s.insert.class})@toDostatusval todostatus.completed} ، message = "{toDo.todostatus.update}" ، المجموعات = {c.update.class ، s.update.class}) TODOSTATUS TODOSTATUS ؛التعليقات التوضيحية المخصصة
@موثقة@القيد (التحقق من صحة = {todostatusvalid.todoStAtusValidFactory.class})@target ({elementType.field ، elementType.annotation_type ، elementType.Parameter})@entrypolicy.runtime)@repeatfift TODOSTATUSVALID {String Message () افتراضي "الرجاء إدخال الحالة الصحيحة" ؛ TODOSTATUS [] ENUMS () افتراضي {} ؛ الفئة <؟> [] المجموعات () الافتراضي {} ؛ الفئة <؟ يمتد Payload> [] Payload () افتراضي {} ؛ فئة todostatusvalidfactory تنفذ constraintvalidator <todostatusvalid ، todostatus> {private todostatus [] enums ؛ Override public void تهيئة (todostatusvalid todostatusvalid) {this.enums = todostatusvalid.enums () ؛ } Override boolean isValid (قيمة todostatus ، سياق constraintValIdatorContext) {todostatus [] القيم = todostatus.values () ؛ if (enums! = null && enums.length! = 0) {stable = enums ؛ } if (arrays.aslist (القيم). contains (value)) إرجاع true ؛ العودة كاذبة }} target ({elementType.field ، elementType.annotation_type ، elementType.Parameter}) reation (enthinationpolicy.runtime) documented interface list {todostatvalid [] value () ؛ }}لخص
ما سبق هو ما يستخدمه المحرر الذي قدمه Springboot JSR 303 للتحقق من طبقة التحكم في وحدة التحكم والتحقق من طبقة خدمة الخدمة AOP. استخدم ملفات موارد الرسائل لتدويل الرسائل. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!