1: الأساسيات الفاشلة الفاشلة
1. مقدمة:
باستخدام تعليقات التعليقات التوضيحية لإضافة قيود على سمات الفصل أو الفصل ، تحقق من شرعية قيمة السمة أثناء وقت التشغيل.
2. الوظيفة:
يعد التحقق من المعلمة أمرًا مهمًا للغاية في تطوير واجهة API ، لأن العميل قد يجتاز عدد أقل من المعلمات ، أو أن القيمة غير قانونية ، أو حتى قيمة المعلمة ضارة ، لذلك يجب التحقق من شرعية المعلمات التي ينقلها العميل. من بينها ، يعد التعليق على قواعد التحقق من قيم المعلمات للسمات من خلال التعليق التوضيحي طريقة أنيقة نسبيًا.
3. التعليقات التوضيحية للقيود شائعة الاستخدام
4. احصل
عنوان الفئة العامة {notnull private String Line1 ؛ سلسلة خاصة 2 ؛ سلسلة خاصة zip ؛ حالة السلسلة الخاصة ؛ length (max = 20) notnull private String Country ؛ Range (min = -2 ، max = 50 ، message = "Floor Out of Range") public int floor ؛ // getter && setter}اثنان: دمج التحقق من السبات الفاشل
تم دمج هذا المثال بناءً على تكامل springmvc+fastjson (//www.vevb.com/article/139094.htm). يمكنك أولاً إلقاء نظرة على هذه المقالة (مع رمز المصدر للتنزيل) ودمج Hibernate-Validator استنادًا إلى هذه المقالة.
خطوات التكامل:
1. إدخال التبعية الفاشلة الفاشلة في pom.xml
<Rependency> <roupeD> org.hibernate </groupId> <StifactId> Hibernate-Validator </artifactid> <sophy> 5.4.1.final </version> </sependency>
2. قم بتكوين المدقق في [xxx] -servlet.xml: HibernateValidator
<!-<mvc: تعليق التوضيح> إضافة صحة صحة addative = "Valitator"-> <mvc: adadator-the enoatation = "devalator"> <mvc: message-converters defaults = "true"> <!-تكوين fastjson لاستبدال دعم جاكسون الأصلي-> <sipperial> <Value> text/html ؛ charset = utf-8 </value> <value> application/json </value> </list> </property> <property name = "features"> <list> <value> QuoteFieldNames </value> <value> writeMapnullue </value ID = "Validator"> <property name = "providerclass" value = "org.hibernate.validator.hibernatevalidator"/> <property name = "ValidationMessagesource" ref = "messagesource"/> </bean> <bean id = "messagesource <Value> classpath: org/hibernate/adadator/validationMessages </value> </list> </sprention> <property name = "usecodeasdefaultmessage" value = "false"/> <property name = "defaultencoding" value = "utf-8"/> <property name = "cacheseconds" value = "60"
3. تحديد ملف رسالة التحقق الوصف
تحقق
4. إنشاء فئة كيان جديدة للاختبار
المستخدم
package com.mengdee.manage.validator ؛ import javax.validation.constraints.min ؛ import javax.validation.constraints.notnull ؛ import javax.validation.constraints.null ؛ import javax.validation.crownts.pattern ؛ org.hibernate.validator.constraints.length ؛ import org.hibernate.validator.constraints.notblank ؛ مستخدم فئة عامة {null (المجموعات = {groupa.class}) notnull (المجموعات = {groupb.class}) min ( معرف طويل خاص ؛ notblank (مجموعات = {groupa.class ، groupb.class}) pattern (regexp = "^(؟! [0-9]+$) (؟! [a-za-z]+$) [0-9a-za-z] GroupB.Class}) كلمة مرور السلسلة الخاصة ؛ notblank (مجموعات = {groupa.class ، groupb.class}) pattern (regexp = "^((13 [0-9]) | (15 [^4 ، // d]) | notblank (مجموعات = {groupb.class}) length (min = 6 ، max = 12 ، message = "طول اللقب هو 6 إلى 12 بت") لقب السلسلة الخاصة ؛ min (value = 18 ، message = "{validation.param.age}") private int age ؛ notblank (مجموعات = {groupa.class}) eMail (message = "{validation.common.format.error}") private string email ؛ notBlankLength (min = 3 ، max = 10 ، message = "{validead.common.not.range}") private string username ؛ المستخدم العام () {} public long getId () {return id ؛ } public void setId (id long) {this.id = id ؛ } السلسلة العامة getNickName () {return labes. } public void setNickName (سلسلة لقب) {this.nickName = nablemed ؛ } public int getage () {return Age ؛ } public void setage (int age) {this.age = age ؛ } السلسلة العامة getEmail () {return email ؛ } public void setemail (string email) {this.email = email ؛ } السلسلة العامة getPassword () {return password ؛ } public void setPassword (سلسلة كلمة مرور) {this.password = password ؛ } السلسلة العامة getUserName () {return username ؛ } public void setusername (string username) {this.userName = username ؛ } السلسلة العامة getPhone () {return phone ؛ } public void setphone (سلسلة الهاتف) {this.phone = phone ؛ }}UserModel
package com.mengdee.manage.validator ؛ import javax.validation.constraints.min ؛ import javax.validation.constraints.pattern ؛ import org.hibernate.validator.constraints.email org.hibernate.validator.constraints.notblank ؛ الفئة العامة usermodel {min (value = 1 ، message = "يجب أن تكون قيمة المعرف أكبر من 0") معرف طويل خاص ؛ notblanklength (min = 6 ، max = 12 ، message = "طول اللقب هو 6 إلى 12 رقمًا") لقب السلسلة الخاصة ؛ min (value = 18 ، message = "{validation.param.age}") private int age ؛ notblank @email (message = "{validation.common.format.error}") private string email ؛ notblankpattern (regexp = "^(؟! [0-9]+$) (؟! [A-ZA-Z]+$) [0-9A-ZA-Z] {6،20} $" ، message = "تكوين رسائل وأرقام 6-21 ، لا يمكن أن تكون أرقامًا خالصة أو اللغة الإنجليزية النقية") كلمة مرور سلسلة خاصة ؛ notBlankLength (min = 3 ، max = 10 ، message = "{validead.common.not.range}") private string username ؛ notblankpattern (regexp = "^((13 [0-9]) | (15 [^4 ، // d]) | (18 [0،3-9])) // d {8} $" ، message = "تنسيق رقم الهاتف المحمول غير صحيح") هاتف سلسلة خاص ؛ Public UserModel () {} public long getId () {return id ؛ } public void setId (id long) {this.id = id ؛ } السلسلة العامة getNickName () {return labes. } public void setNickName (سلسلة لقب) {this.nickName = nablemed ؛ } public int getage () {return Age ؛ } public void setage (int age) {this.age = age ؛ } السلسلة العامة getEmail () {return email ؛ } public void setemail (string email) {this.email = email ؛ } السلسلة العامة getPassword () {return password ؛ } public void setPassword (سلسلة كلمة مرور) {this.password = password ؛ } السلسلة العامة getUserName () {return username ؛ } public void setusername (string username) {this.userName = username ؛ } السلسلة العامة getPhone () {return phone ؛ } public void setphone (سلسلة الهاتف) {this.phone = phone ؛ }}userDetail:
package com.mengdee.manage.validator ؛ استيراد org.hibernate.validator.constraints.notblank ؛ فئة عامة userDetail {private long id ؛ notblank عنوان السلسلة الخاصة ؛ notblank شركة سلسلة خاصة ؛ userDetail public () {} public long getId () {return id ؛ } public void setId (id long) {this.id = id ؛ } السلسلة العامة getAddress () {return address ؛ } public void setAddress (عنوان السلسلة) {this.address = العنوان ؛ } السلسلة العامة getCompany () {Return Company ؛ } public void setCompany (String Company) {this.company = Company ؛ }}الاختبار مع ValiverController
package com.mengdee.manage.controller ؛ استيراد javax.servlet.http.httpservletrequest ؛ استيراد javax.validation.valid org.springframework.validation.fielderror ؛ استيراد org.springframework.web.bind.annotation.requestmapping ؛ استيراد org.springframework.web.bind.annotation.requestmethod com.mengdee.manage.validator.usermodel ؛@controller@requestMapping ("/aldight") فئة عامة ValidController تمتد BaseController {// http: // localhost: 8081/platform-springmvc-webapp/appal/test؟ age=18&nickname=mengdee&id=1&[email protected]&password=root123&username=123&phone=18321758957 @ Responsebody Object Condition (طلب httpservletrequest ، مستخدم Valid UserModel ، bindingResult BindingResult) {if (bindingResult.haserrors ()) {fielderror fielderror = bindingresult.getfielderror () ؛ Return Super.ResponseJsonerror (Fielderror) ؛ } إرجاع "موافق" ؛ } // طريقة للتحقق من كائنات متعددة في نفس الوقت تتطلب ربط نتائج متعددة. يظهر Valid ، وهو ما يتوافق مع BindingResult المعلن لاحقًا. requestmapping (value = "/test2" ، method = requestMethod.get) publicResponseBony Object ValidentMore (httpservletrequest request ، @ @usermodel مستخدم ، bindingresult bindingresult ، @userdetail userdetail ، bindingresultulresult2) bindingResult.getFielderror () ؛ Return Super.ResponseJsonerror (Fielderror) ؛ } if (bindingResult2.haserRors ()) {fielderror fielderror = bindingResult2.getFielderror () ؛ Return Super.ResponseJsonerror (Fielderror) ؛ } إرجاع "موافق" ؛ }}ملاحظات عند الاستخدام:
1. بالنسبة للحقول المتعددة ، يبدو أن ترتيب التحقق من النظام يختلف عن ترتيب إعلان الحقل ، كما لو كان غير ضروري.
2. لكل التحقق ، إذا لم يكن هناك سمة رسالة ، فسيستخدم النظام الافتراضي ، مثل notblank المقابل يعادل notblank (message = "لا يمكن أن يكون فارغًا")
3. للحصول على أنواع مرجعية مثل String ، يجب استخدامه بالتزامن مع NotNull أو Notempty أو Notblank. إذا لم تكتب قيدًا فارغًا ، بعد الاختبار ، فلن يشارك هذا الحقل في التحقق. إذا كنت تستخدم pattern ، length ، eMail ، إلخ. وحده ، فلن يتم التحقق منه. يجب عليك استخدام قيد فارغ للحد منه.
min: تستخدم لأنواع البيانات الأساسية ، مثل int ، long ، إلخ.
notnull: لا يمكن أن تكون قيمة أي كائن لاغية
notempty: عنصر كائن المجموعة ليس 0 ، أي ، المجموعة ليست فارغة ، ويمكن أيضًا استخدامها للسلاسل وليس الفارغ
notblank: لا يمكن استخدامه إلا للسلسلة غير الفار
ثلاثة: التحقق من مجموعة validated
1. دور التجميع (استخدام السيناريو):
يحتوي كل قيد توضيح التحقق من سمة مجموعة ، يتم استخدامه لتحديد المجموعة التي ينتمي إليها القيد. وبهذه الطريقة ، يمكن تكوين مجموعات متعددة من القيود على نفس الحقل. عند استخدامه ، تحتاج فقط إلى تحديد مجموعة القيود التي يجب استخدامها. على سبيل المثال ، عند تسجيل المستخدمين وتعديل معلومات المستخدم ، يجب أن يكون المعرف فارغًا عند التسجيل ، ويجب ألا يكون المعرف فارغًا عند تعديل معلومات المستخدم. عند استخدامه ، تحتاج فقط إلى تعيين هاتين القيود لمجموعات مختلفة. على سبيل المثال ، عند الإضافة ، باستخدام قيود المجموعة A ، واستخدام قيود المجموعة B عند التحديث.
2. الحزمة هي واجهة فارغة
Groupa و GroupB
package com.mengdee.manage.validator ؛ public interface groupa {} package com.mengdee.manage.validator ؛ public interface groupb {}عند استخدام Validated ({groupa.class})
3. مجموعة sequence @groupsequence
بشكل افتراضي ، يتم إجراء التحقق من القيد من مجموعات مختلفة ، ويتم التحقق من تسلسل المجموعة بالتسلسل في المجموعة قبل وبعد الترتيب ، مثل التحقق من قيود مجموعة المجموعة أولاً ، ثم التحقق من قيود مجموعة المجموعة. إذا كانت هناك متطلبات لترتيب التحقق من المجموعات ، على سبيل المثال ، يجب عليك أولاً التحقق
استخدم السيناريوهات:
(1) يعتمد التحقق من القيد في المجموعة الثانية على حالة مستقرة للتشغيل ، ويتم التحقق من هذه الحالة المستقرة من قبل المجموعة الأولى.
(2) التحقق من مجموعة معينة يستغرق وقتًا طويلاً ، ومعدل وحدة المعالجة المركزية ومعدل استخدام الذاكرة كبير نسبيًا. الخيار الأفضل هو وضعه في النهاية للتحقق. لذلك ، عند إجراء التحقق من المجموعة ، لا تزال هناك حاجة إلى طريقة التحقق منظمة ، والتي تقترح مفهوم تسلسل المجموعة.
يمكن تعريف المجموعة على أنها تسلسل للمجموعات الأخرى ، ويجب أن تتوافق مع الترتيب المحدد في التسلسل عند استخدامه للتحقق. عند استخدام التحقق من تسلسل المجموعة ، في حالة فشل التحقق من المجموعة قبل فشل التسلسل ، فلن يتم التحقق من صحة المجموعات اللاحقة.
تحديد تسلسل المجموعة باستخدام مجموعة التعليقات التوضيحية: Groupab
package com.mengdee.manage.validator ؛ import javax.validation.groupequence ؛ groupequence ({groupa.class ، groupb.class}) واجهة عامة groupab {ValityController
package com.mengdee.manage.controller ؛ استيراد javax.servlet.http.httpservletrequest ؛ استيراد org.springframework.stereotype.controller org.springframework.validation.annotation.validated ؛ استيراد org.springframework.web.bind.annotation.requestmapping ؛ استيراد org.springframework.web.bind.annotation.requestmethod ؛ com.mengdee.manage.validator.groupa ؛ استيراد com.mengdee.manage.validator.groupab ؛ استيراد com.mengdee.manage.validator.groupb ؛ استيراد com.mengdee.manage.validator.userentity المحدد أثناء التحقق ، بحيث يتم فحص القيود التي تحتوي على مجموعة فقط. إذا لم يكن هناك إدراج ، فلن يكون هناك أي التحقق. على سبيل المثال ، بالنسبة للهاتف ، لا تحدد المجموعة المحددة بواسطة notblank ، و @pattern مجموعة ، ثم يتم التحقق من قيود واحدة فقط فارغة ، ولا يتم فحص تنسيق رقم الهاتف المحمول // http: // localhost: 8081/platform-springmvc-webapp/groupa؟ password = root123 & phone = 123. requestMethod.get) publicresponsebody Object Groupa (httpservletrequest request ، @validated ({groupa.class}) مستخدم المستخدم ، bindingresult bindingResult) {if (bindingresult.haserrors ()) {fielderror fielderror = bindingresult.getfielder () ؛ إرجاع this.responsejsonerror (fielderror) ؛ } إرجاع "موافق" ؛ } // http: // localhost: 8081/platform-springmvc-webapp/addressed/groupb؟ phone = 123 & password = root123 & id = 1 @requestmapping (value = "/groupb" ، method = requestMethod.get) public ersponsebody groupb (httpled request ، bindingResult bindingResult) {if (bindingResult.haserrors ()) {fielderror fielderror = bindingResult.getFielderror () ؛ إرجاع this.responsejsonerror (fielderror) ؛ } إرجاع "موافق" ؛ } // groupab // http: // localhost: 8081/platform-springmvc-webapp/addressated/groupab؟ phone=111&password=root123&nickname=123&[email protected] // @validated ({groupa.class ، groupb.class}. قاعدة البيانات. طالما تم استيفاء حالة واحدة ، سيتم التحقق من القيد. استخدم مجموعات متعددة في نفس الوقت لتلاحظ أنه لا توجد سمة بالتسلسل بين مجموعات متعددة. ليس من التحقق من المجموعة A أولاً ، ثم التحقق من المجموعة B. // نظرًا لأن قيود المعرف فارغة ولا يتم التحقق من عدم الفراغ ، يتم التعليق على السمة أولاً @requestmapping (value = "/groupab" bindingResult bindingResult) {if (bindingResult.haserrors ()) {fielderror fielderror = bindingResult.getFielderror () ؛ إرجاع this.responsejsonerror (fielderror) ؛ } إرجاع "موافق" ؛ } // الافتراضي // http: // localhost: 8081/platform-springmvc-webapp/default؟ [email protected]&age=18 // validated إذا لم يتم تحديد المجموعات ، تحقق من عدم وجود سمة مجموعة (نفس وظيفة valid في هذا الوقت). إذا كانت هناك قيود متعددة على حقل ، فلا يجب تحديد أي مجموعة. إذا كانت المجموعة المحددة مقيدة جزئيًا ولا تحدد القيود الجزئية القيود ، فلا يتم تحديد requestmapping (value = "/default" ، method = requestMethod.get) {fielderror fielderror = bindingResult.getFielderror () ؛ إرجاع this.responsejsonerror (fielderror) ؛ } إرجاع "موافق" ؛ }. requestMethod.get) تسلسل كائن public @ @ @httpservletrequest ، مستخدم مستخدم ({groupab.class}) مستخدم ، bindingresult bindingResult) {if (bindingresult.haserrors ()) {fielderror fielderror = bindingresult.getfielder () ؛ إرجاع this.responsejsonerror (fielderror) ؛ } إرجاع "موافق" ؛ }}الرابع: شرح توضيح التحقق من صحة السبات المخصص
عندما لا يتمكن التعليق التوضيحي الذي يوفره التحقق من صحة السبات في المتطلبات ، يمكنك تخصيص قيود التحقق.
خطوات قيود التعليقات التوضيحية المخصصة:
إنشاء شرح التعليقات التوضيحية
package com.mengdee.manage.validator ؛ استيراد java.lang.annotation.target ؛ استيراد javax.validation.constraint ؛ استيراد javax.validation.payload ؛ استيراد java.lang.annotation.elementtype.annotation_type ؛ استيراد java.lang.laNtation.element java.lang.annotation.elementtype.field ؛ استيراد java.lang.annotation.elementtype.method ؛ استيراد java.lang.annotation.elementtype.parameter java.lang.annotation.retention ؛@target ({method ، الحقل ، التعليق التوضيحي _type ، مُنشئ ، معلمة})@entry (runtime)@موثقة@crodaint (صحة = {phoneconstraint.class} public interface phone {String Message () String regexp () افتراضي "^((13 [0-9]) | (15 [^4 ، // d]) | (18 [0،3-9])) // d {8} $" ؛ الفئة <؟> [] المجموعات () الافتراضي {} ؛ الفئة <؟ يمتد Payload> [] Payload () افتراضي {} ؛ target ({method ، الحقل ، التعليق التوضيحي intype ، مُنشئ ، معلمة}) @rection (runtime) documented public interface list {phone [] value () ؛ }}قم بإنشاء فئة التحقق من القيد تتوافق مع شرح رقم الهاتف المحمول
package com.mengdee.manage.validator ؛ import javax.validation.constraintvalidator ؛ import javax.validation.constraintValidatorContext ؛ public phonecitnaintistraint تنفذ constraintvalidator <phone ، سلسلة> {سلسلة خاصة ؛ Override public void تهيئة (phone phoneannotation) {this.regexp = phoneannotation.regexp () ؛ } Override public boolean isValid (قيمة السلسلة ، سياق constraintValIdatorContext) {if (value == null) {return true ؛ // hv000028: استثناء غير متوقع خلال استدعاء isValid} if (value.matches (regexp)) {return true ؛ } إرجاع خطأ ؛ }}استخدم التعليق التوضيحي على السمات
package com.mengdee.manage.validator ؛ استيراد org.hibernate.validator.constraints.notblank ؛ فئة عامة userDetail {notblank @private سلسلة السلسلة ؛ userDetail () {} السلسلة العامة getPhone () {return phone ؛ } public void setphone (سلسلة الهاتف) {this.phone = phone ؛ }}ملاحظات الاختبار
// http: // localhost: 8081/platform-springmvc-webapp/appal/test3؟ address = 123 & company = 456 & phone = 123 requestMapping (value = "/test3 ، method = requestMethod.get) public reSponseBonder compinitcustomantation bindingResult) {if (bindingResult.haserrors ()) {fielderror fielderror = bindingResult.getFielderror () ؛ Return Super.ResponseJsonerror (Fielderror) ؛ } إرجاع "موافق" ؛ }قم بتنزيل الرمز الكامل:
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.
المادة المرجعية: