تقدم هذه المقالة باختصار كيفية تقديم خطوات التحقق من الصحة ، وكيفية تقليل كمية الكود من خلال التحقق من الصحة المخصصة وتحسين الإنتاجية. ذكر خاص: صالح من سمات النوع غير المحدد ، ومعالجة طرق الحصول على ، دقة موحدة لرسائل خطأ التحقق من الصحة.
يتم تكليف التنفيذ الفعلي للتحقق من الصحة في هذه المقالة للتحقق من صحة السبات للمعالجة
التكوين الأساسي
يقدم بوم تبعيات Maven
<!-يبدأ التحقق من الصحة-> <Rependency> <roupiD> javax.validation </rougiD> <StifactId> التحقق من الصحة </intifactid> <الإصدار> 1.1.0. <splection> 5.4.0.final </version> </reperency> <!-نهاية التحقق->
إضافة تكوين التحقق من الصحة
أضف التكوين التالي إلى spring-mvc-servlet.xml:
<mvc: adadator-revarive enootation = "validator"> <bean id = "deadator"> <property name = "providerclass" value = "org.hibernate.validator.hibernatevalidator"/> <property name = "validationMessagesource" ref =
استثناء مخصص
تخصيص رسالة خطأ التحقق من الصحة ، والمعلومات التي يتم إرجاعها إلى المتصل أكثر ودية. تتم إضافة التكوين التالي إلى ApplicationContext.xml:
<!-قم بتحميل ملف مورد الرسائل I18N-> <bean id = "messagesource"> <property name = "basenames"> <list> <value> errormsg </value>
تمت إضافة إلى project classpath: Validay_error_zh_cn.properties ملف المورد:
#خطأ MSG للتحقق من صحة الإدخال#commonfield.can.not.be.null = {field} لا يمكن أن يكون فارغًا حقلًا. ValidentExceptionResovler تطبيق:
ValidationExceptionResovler.java
@slf4jpublic class classexceptionResovler يمتد ArgTracthandLerexceptionResolver {public ValidationExceptionResovler () {// set order وتنفيذ this.setorder (0) ؛ } /** * تعامل مع الحالة التي تفشل فيها وسيطة مع {codevalid} مثل * {link} أو {link} تفشل الوسيطة. * <p> * معالج استثناء Custom ValuadeException * احصل على رسالة خطأ التحقق من الصحة المحددة وتجميع الاستجابة المشتركة والعودة إلى المتصل. *. طلب httpservletRequest ، استجابة httpservletresponse ، معالج الكائن) يلقي ioException {list <homferError> errors = bindingResult.getAllerRors () ؛ StringBuffer errmsgbf = new StringBuffer () ؛ لـ (ObjectError Error: Errors) {String mass = error.getDefaultMessage () ؛ errmsgbf.append (التدليك) ؛ errmsgbf.append ("||") ؛ } String errmSgString = errmsgbf.toString () ؛ errmsgString = errmsgString.length ()> 2؟ errmSgString.SubString (0 ، errmsgstring.length () - 2): errmsgstring ؛ log.error ("فشل التحقق! {}" ، errmsgString) ؛ خريطة <string ، object> map = new treemap <string ، Object> () ؛ map.put ("النجاح" ، خطأ) ؛ map.put ("errorcode" ، "9999") ؛ map.put ("errormsg" ، errmsgstring) ؛ modelandview mav = new ModelAndView () ؛ MapPingJackson2JsonView عرض = جديد MapPingJackson2JsonView () ؛ view.setattributesmap (MAP) ؛ Mav.SetView (عرض) ؛ إرجاع ماف. } Override modelandview doresolveexception (طلب httpservletrequest ، استجابة httpservletresponse ، معالج الكائن ، استثناء ex) {bindingResult bindingResult = null ؛ if (ex exateof methodArgumentNotvalidexception) {bindingResult = (methodArgumentNotValidexception) ex) .getBindingResult () ؛ } آخر إذا (ex extoryof bindException) {bindingResult = ((bindException) ex) .getBindingResult () ؛ } آخر {// استثناء آخر ، تجاهل} if (bindingResult! = null) {try {return handlemethodargumentnotvalidexception (bindingresult ، request ، response ، handler) ؛ } catch (ioException e) {log.error ("doresolveException:" ، e) ؛ }} الإرجاع null ؛ }} أضف Valid في وحدة التحكم
requestmapping ("/buy")@reviewbodypublic baseresponse شراء (requestbodyvalid buyflowerRequest request) رمي الاستثناء {// ......} أضف توضيح التحقق من الصحة إلى السمات التي تتطلب التحقق من صحة الحبة
@setter@getterpublic class buyflowerRequest {notempty (message = "{name.can.not.be.null}") اسم السلسلة الخاصة ؛} التحقق من صحة الأشياء الثانوية
يمكن أن تتحقق طريقة الكتابة أعلاه فقط من سمات النوع الأساسي لـ BuyflowerRequest ، ولكن لا توجد طريقة للتحقق من صحة سمات سمات الكائن. إذا كنت بحاجة إلى التحقق من صحة سمات الكائن الثانوي ، فأنت بحاجة إلى إضافة تعليقات التحقق من صحة ValID والتحديد إلى الكائن الثانوي وسمات الكائن الثانوي في نفس الوقت.
طريقة الكتابة التالية:
@setter @getterpublic class buyflowerRequest {notempty (field = "bianname") اسم السلسلة الخاصة ؛ min (Field = "Price" ، value = 1) Private Int Price ؛ notnull list private list <DAYTYPE> paytypelist ؛} @setter @getterpublic class paytype {validmin (value = 1) private int paytype ؛ valid min (القيمة = 1) private int payamount ؛} مزيد من تقليل عدد الترميزات
من أجل تقليل عبء العمل الترميز ، من خلال تعليقات التحقق من الصحة المخصصة ، حاول تمرير اسم التحقق من الصحة إلى ملف المورد لرسالة الخطأ ، وبالتالي تجنب كتابة قوالب رسائل مختلفة لكل مجال.
فيما يلي مثال على إعادة كتابته @notnull:
1. تحديد شرح التحقق من الصحة ، لاحظ أنه يتم إضافة الحقل () مقارنة بالتعليقات التعليمية الأصلية ، والذي يتم استخدامه لتمرير الاسم المرفق الذي تم التحقق منه.
notnull.java
target ({elementType.method ، elementType.field ، elementType.annotation_type ، elementType.Constructor ، elementType.Parameter})@crodent (addrentedby = {notnullvalidator.class}) strention (strenking.runtime)@string ard رسالة سلسلة () افتراضي "{field.can.not.be.null}" ؛ الفئة <؟> [] المجموعات () الافتراضي {} ؛ الفئة <؟ يمتد Payload> [] Payload () افتراضي {} ؛} 2. تحديد المدقق ، يقوم جميع المصقوقين بتنفيذ واجهة CrodentValidator:
notnullvalidator.java
الطبقة العامة notnullvalidator تنفذ constrentvalidator <notnull ، object> {Override public void تهيئة (عدمه التعليق) {} ouverride boolean isValid (Object str ، constraintvalidatorcontext constrentvalidatorcontext) {return str! = null ؛ }} 3. أضف تعليق توضيح التحقق من الصحة إلى المودعة ، انتبه إلى تحديد القيمة المقدمة. إذا لم يكن للرسالة متطلبات مخصصة ، فلن تحتاج إلى تحديدها. سيقوم مكون التحقق من الصحة بملء الرسالة الافتراضية بنفسه.
buyflowerRequest.java
@setter @getterpublic class buyflowerRequest {notempty (field = "bianname") اسم السلسلة الخاصة ؛ min (field = "السعر" ، القيمة = 1) سعر int الخاص ؛} ملاحظة: يدعم التعليق التوضيحي Notnull بالفعل التحقق الخاص للقائمة. للحصول على العقد نوع القائمة ، إذا كانت قائمة == null || list.size () == 0 سوف يعود خطأ وفشل التحقق من الصحة. حاليًا ، تم تخصيص Notnull و @notempty و @min و max وفقًا لهذه الفكرة ، ويمكن العثور عليها في مشروع البضائع.
دعم الحصول على طلبات
الأمثلة المذكورة أعلاه هي جميع طلبات النشر. يمكن لـ @REQUESTBODY حل طلبات البريد ، لكنها لا تدعم طلبات الحصول على طلبات. اقرأ وثائق الربيع ورمز المصدر ووجدت أن modelattribute يمكن حلها الحصول على طلبات في الفاصوليا والتحقق من صحة الدعم. للحصول على التفاصيل ، يمكنك قراءة رمز مصدر الربيع: ModelAttributemethodprocessor.Resolveargument () طريقة.
مثال على الاستخدام:
requestmapping (value = "/buy" ، method = requestMethod.get) responsebodypublic baseresponse تفاصيل (@validmodelattribute detailWorequest request) rems {deliefflowerResponse response = new deliefflowerResponse () ؛ Response.setName (request.getName ()) ؛ return resultfactory.success (الاستجابة ، baseresponse.class) ؛} تودو
1. توسيع التحقق من الصحة وفقًا لسيناريوهات العمل ، مثل: تنسيق التاريخ ، المبلغ ، إلخ.
2. دعم التحقق من صحة العلاقة الميدانية المتعددة
المرفق: رمز مفتاح تنفيذ التحقق من صحة الربيع
requestbody
فئة التنفيذ: requestResponseBonderMethodProcessor.java
الكائنات العامة Resolveargument (المعلمة MethodParameter ، ModelandViewContainer Mavcontainer ، NativeWebRequest WebRequest ، WebDatabinderFactory Binderfactory) يلقي استثناء {Object arg = this.readwithmessageConverters (WebRequest ، parameter.getgenerype ()) ؛ اسم السلسلة = Conventions.getVariablenameForparameter (المعلمة) ؛ WebDatabinder Binder = bindfactory.createBinder (WebRequest ، Arg ، name) ؛ if (arg! = null) {this.validateifapplable (binder ، parameter) ؛ if (binder.getBindingResult (). haserrors () && this.isBindExceptionRequired (binder ، parameter)) {رمي methodArgumentNotvalidexception (المعلمة ، binder.getBindingResult ()) ؛ }} mavcontainer.addattribute (bindingResult.model_key_prefix + name ، binder.getBindingResult ()) ؛ إرجاع arg ؛} modelattuite
فئة التنفيذ: ModelAttributemethodprocessor.java
Resolveargument الكائن النهائي العام (المعلمة MethodParameter ، ModelandViewContainer Mavcontainer ، NativeWebRequest WebRequest ، WebDatabinderFactory Binderfactory) يلقي استثناء {String name = modelfactory.getNameForparameter (المعلمة) ؛ سمة الكائن = mavcontainer.containsattribute (الاسم)؟ mavcontainer.getModel (). get (name): this.createAttribute (الاسم ، المعلمة ، bindFactory ، webRequest) ؛ if (! mavcontainer.isbindingDisabled (name)) {modelAttribute Ann = (ModelAttribute) parameter.getParameterAnnotation (modelAttribute.class) ؛ if (ann! = null &&! ann.binding ()) {mavcontainer.setBindingDisabled (name) ؛ }} WebDatabinder Binder = bindFactory.CreateBinder (WebRequest ، السمة ، الاسم) ؛ if (binder.getTarget ()! = null) {if (! mavcontainer.isbindingDisabled (name)) {this.bindRequestParameters (Binder ، WebRequest) ؛ } هذا. if (binder.getBindingResult (). haserrors () && this.isBindExceptionRequired (binder ، parameter)) {رمي bindException جديد (binder.getBindingResult ()) ؛ }} map <string ، object> bindingResultModel = binder.getBindingResult (). getModel () ؛ mavcontainer.removeattributes (bindingResultModel) ؛ mavcontainer.addallattributes (bindingResultModel) ؛ return Binder.Convertifnecessary (Binder.getTarget () ، parameter.getParameterType () ، المعلمة) ؛}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.